设计模式(三):简单工厂、工厂方法、静态工厂模式

简单工厂模式(Simple Factory)

不属于23种设计模式之一。
由三个角色组成:

  • 工厂类:生产具体产品
  • 抽象产品
  • 具体产品
image.png

示例代码:

//工厂类
class MouseFactory {
    public static function createMouse($type) {
        switch($type) {
            case 'deil':
                return new DeilMouse();
            case 'hp':
                return new HpMouse();
            default:
                throw new Exception('error type');
        }
    }
}
//抽象产品
abstract class Mouse {
    public abstract function click() {};
}
//具体产品
class DeilMouse extends Mouse {
     public function click() {
     }
}
class HpMouse extends Mouse {
     public function click() {
     }
}

工厂方法模式(Factory Method)

image.png

它由四种角色组成:

  • 抽象工厂
  • 具体工厂
  • 抽象产品
  • 具体产品
//抽象工厂
abstract class MouseFactory{
    public abstract function createMouse();
}
//具体工厂
class DeilFactory extends MouseFactory{
    public function createMouse() {
         return new DeilMouse();
    }
}
class HpFactory extends MouseFactory{
    public function createMouse(){
         return new HpMouse();
    }
}

工厂方法模式是完全符合开闭原则的。当有新产品时,只要创建并继承抽象产品;新建具体工厂继承抽象工厂;而不用修改现有任何代码。
缺点是当产品种类非常多时,就会出现大量的与之对应的工厂类。

抽象工厂(Abstract Factory)

抽象工厂模式也就是不仅生产鼠标,同时生产键盘。
也就是PC厂商是个父类,有生产鼠标,生产键盘两个接口。

image.png

在抽象工厂模式中,假设我们需要增加一个工厂

在抽象工厂模式中,假设我们需要增加一个产品

image.png

由上图可以看出,抽象工厂模式是不符合开闭原则的,产品族扩展非常困难,要增加一个产品,既要在抽象工厂里加代码,又要在具体工厂里面加代码。

你可能感兴趣的:(设计模式(三):简单工厂、工厂方法、静态工厂模式)