美文网首页
设计模式(三):简单工厂、工厂方法、静态工厂模式

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

作者: 何笙 | 来源:发表于2019-05-08 15:22 被阅读0次

    简单工厂模式(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

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/fhkyoqtx.html