好的,那么接下来,问题又来了,公司准备多元化产品,增加桔子味饮料,那么我们需要怎么做呢,首先要增加桔子味饮料类,然后需要在工厂里增加判断,当水果标识是orange的时候,返回桔子味饮料
class OrangeDrink{
function getDrinkName()
{
echo '桔子味饮料';
}
}
class FruitFactory{
function makeDrink($fruit){
if ($fruit == 'apple'){
return new AppleDrink();
}elseif ($fruit == 'banana'){
return new BananaDrink();
}elseif ($fruit == 'orange'){
return new OrangeDrink();
}
}
}
然后当以后每次需要增加新的产品时,我们都需要更改工厂文件,当对象生成复杂的时候,这个工厂文件会越来越大,更改或许会引起一些意想不到的问题
面向对象的设计原则,对扩展开放,对更改关闭,那么有没有办法,在不更改原有代码的基础上,增加产品呢
答案是有的,咱们再改写一下这个方法
<?php
interface Drink{
function getDrinkName();
}
class AppleDrink implements Drink{
function getDrinkName()
{
echo '苹果味饮料';
}
}
class BananaDrink implements Drink{
function getDrinkName()
{
echo '香蕉味饮料';
}
}
interface FruitFactory{
function makeDrink();
}
class AppleFactory implements FruitFactory{
function makeDrink()
{
return new AppleDrink();
}
}
class BananaFactory implements FruitFactory{
function makeDrink()
{
return new BananaDrink();
}
}
$appleFactory = new AppleFactory();
$apple = $appleFactory->makeDrink();
$apple->getDrinkName();
echo "<br/>";
$bananaFactory = new BananaFactory();
$banana = $bananaFactory->makeDrink();
$banana->getDrinkName();
运行结果:
苹果味饮料
香蕉味饮料
现在当再次需要增加桔子味饮料时,只需要增加桔子味饮料产品和桔子味饮料工厂即可,不需要改动原来的代码
class OrangeDrink implements Drink{
function getDrinkName()
{
echo '桔子味饮料';
}
}
class OrangeFactory implements FruitFactory{
function makeDrink()
{
return new OrangeDrink();
}
}
这就是工厂模式,它是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现开闭原则,实现了对扩展开放,对更改关闭。其次实现更复杂的层次结构,可以应用于产品结果复杂的场合。工厂方法模式是对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不在负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
