设计模式之 “工厂模式”

268 阅读3分钟

【技术分享】从Tensorflow源码中学习设计模式

cloud.tencent.com/developer/a…

总结

  • 简单工厂模式:一个工厂类,一个产品抽象类。

简单工厂模式有唯一的工厂类,工厂类的创建方法根据传入的参数做if-else条件判断,决定最终创建什么样的产品对象。

  • 工厂方法模式:多个工厂类,一个产品抽象类。

工厂方法模式由多个工厂类实现工厂接口,利用多态来创建不同的产品对象,从而避免了冗长的if-else条件判断。

  • 抽象工厂模式:多个工厂类,多个产品抽象类。

抽象工厂模式把产品子类进行分组,同组中的不同产品由同一个工厂子类的不同方法负责创建,从而减少了工厂子类的数量。

正文

核心内容提炼自<程序员小灰>

  • Q:一般情况下怎么创建对象

A:直接new一个对象

  • Q:如果创建对象有一些初始化操作,在哪里实现?

A:写在构造函数里

class Mask {
public:
    Mask(){
        // 5行初始化代码
        // .....
    }
}
  • Q:如果初始化操作有100行,比如关联其他对象,查数据库,查配置文件,还写在构造函数里吗?

A: 写在构造函数里太冗长,不妨写一个特殊的类,工厂类,专门用于初始化

class MaskFactory {
public: 
    Mask createMask() {
        Mask mask = new Mask();
        // 100行初始化代码
        // .....
        return mask;
    }
}
  • Q: 如果Mask存在子类,怎么创建对象?

A: 将子类类型作为参数传给工厂,工厂里根据不同子类类型走进不同分支进行创建

这就是简单工厂模式

class HighEndMask::Mask {
publicHighEndMask() {
        printf("我是高端口罩");
    }
}

class LowEndMask::Mask {
publicLowEndMask(){
        printf("我的低端口罩");
    }
}
class MaskFactory{
public:
    Mask createMask(String type) {
        Mask mask = null;
        if("高端口罩" == type){
            mask = new HighEndMask();
            // .....
            // HighEndMask的100行初始化代码
        }else if("低端口罩" == type){
            mask =  new LowEndMask();
            // .....
            // LowEndMask的100行初始化代码
        }
        return mask;
    }
}
int main(String[] args) {
        MaskFactory factory = new MaskFactory();
        Mask maskA = factory.createMask("高端口罩");
        Mask maskB = factory.createMask("低端口罩");
    }
}
  • Q: 增加新的口罩种类,就要在工厂中增加一条分支,不符合面向对象的开放-封闭原则,改怎么改进?

A:可以为每一个口罩子类创建对应的工厂子类,这些工厂子类分别实现抽象的工厂接口,利用动态多态实现

这就是工厂方法模式

class HighEndFactory::MaskFactory{
public:
    Mask createMask() {
        Mask mask =  new HighEndMask();
        // .....
        // HighEndMask的100行初始化代码
        return mask;
    }
}

class LowEndFactory::IMaskFactory{
public:
    Mask createMask() {
        Mask mask =  new LowEndMask();
        // .....
        //  LowEndMask的100行初始化代码
        return mask;
    }
}
int main(String[] args) {
        MaskFactory factoryA = new LowEndFactory();
        MaskFactory factoryB = new HighEndFactory();
        Mask maskA = factoryA.createMask();
        Mask maskB = factoryB.createMask();
}
  • Q: 每一个子类都建立一个工厂,这样实在太繁琐了

image.png

A:为了避免工厂子类越来越多,引入抽象工厂模式,对工厂子类进行抽象。把产品类分组,组内不同产品对应于同一工厂类的不同方法

这就是抽象工厂模式

image.png

//产品类代码
class LowEndMask::Mask {
    void showMask(){
        printf("我的低端口罩");
    }
}
class HighEndMask::Mask {
    void showMask() {
        printf("我是高端口罩");
    }
}

class LowEndProtectiveSuit::ProtectiveSuit {
    void showSuit() {
        println("我是低端防护服");
    }
}
class HighEndProtectiveSuit::ProtectiveSuit {
    void showSuit() {
        printf("我是高端防护服");
    }
}
//工厂类代码

class LowEndFactory::Factory {
    Mask createMask() {
        Mask mask =  new LowEndMask();
        // .....
        //  LowEndMask的100行初始化代码
        return mask;
    }

    ProtectiveSuit createSuit() {
        ProtectiveSuit suit =  new LowEndProtectiveSuit();
        // .....
        //  LowEndProtectiveSuit的100行初始化代码
        return suit;
    }
}

class HighEndFactory::IFactory {
    Mask createMask() {
        Mask mask =  new HighEndMask();
        // .....
        // HighEndMask的100行初始化代码
        return mask;
    }

    ProtectiveSuit createSuit() {
        ProtectiveSuit suit =  new HighEndProtectiveSuit();
        // .....
        //  HighEndProtectiveSuit的100行初始化代码
        return suit;
    }
}
//客户端代码
int main(String[] args) {
        Factory factoryA = new LowEndFactory();
        Factory factoryB = new HighEndFactory();
        
        //创建低端口罩
        Mask maskA = factoryA.createMask();
        //创建高端口罩
        Mask maskB = factoryB.createMask();
        //创建低端防护服
        ProtectiveSuit suitA = factoryA.createSuit();
        //创建高端防护服
        ProtectiveSuit suitB = factoryB.createSuit();

        maskA.showMask();
        maskB.showMask();
        suitA.showSuit();
        suitB.showSuit();
    }
}