工厂模式

来源:互联网 发布:ipad pro 10.5 知乎 编辑:程序博客网 时间:2024/05/17 03:06

工厂模式的使用情景
1、客户类不关心使用哪个具体类,只关心该接口所提供的功能
2、创建过程比较复杂,比如需要初始化其他关联的资源类,服务配置文件等
3、接口有很多具体实现或抽象类有很多具体子类时,你可能需要为客户代码写一大串if-else 
    逻辑来决定运行时使用哪个具体实现或者具体子类
4、不希望给客户程序暴露过多此类的内部结构,隐藏这些细节可以降低耦合度。
5、优化性能,比如缓存大对象或者初始或比较耗时的对象


工厂模式属于创建型模式,大致可分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。



简单工厂模式:在工厂类中做判断,从而创造响应的产品。

简单工厂模式UML图



enmu CTYPE {COREA, COREB};//枚举class SingleCore{public:    virtual void Show() = 0;//纯虚函数};class SingleCoreA: public SingleCore{public:    void show(){ cout << "SingleCore A" << endl; }};class SingleCoreB: public SingleCore{public:    void Show(){ cout << "SingleCore B" << endl; }};class Factory{public:    SingleCore* CreateSingleCore(enum CTYPE ctype){        if(ctype == COREA)            return new SingleCoreA();//生产核A        else if(ctype == COREB)            return new SingleCoreB();//生产核B        else            return NULL    }};


工厂方法模式:指定义一个用于创建对象的接口,让子类决定实例化哪一个类。

工厂方法模式UML图


class SingleCore{public:    virtual void Show() = 0;//纯虚函数};class SingleCoreA: public SingleCore{public:    void show(){ cout << "SingleCore A" << endl; }};class SingleCoreB: public SingleCore{public:    void Show(){ cout << "SingleCore B" << endl; }};class Factory{public:    virtual SingleCore* CreateSingleCore() = 0;};//生产A核的工厂class FactoryA{public:    SingleCoreA* CreateSingleCore(){ return new SingleCoreA; }};//生产B核的工厂class FactoryB{public:    SingleCoreB* CreateSingleCore(){ return new SingleCoreB; }};


抽象工厂模式:工厂A只生产A型号的产品。。。。。

抽象工厂模式UML图


class SingleCore{public:    virtual void Show() = 0;//纯虚函数};class SingleCoreA: public SingleCore{public:    void show(){ cout << "SingleCore A" << endl; }};class SingleCoreB: public SingleCore{public:    void Show(){ cout << "SingleCore B" << endl; }};class MultiCore{public:    virtual void Show() = 0;};class MultiCoreA: public MultiCore{public:    void Show(){ cout << "MultiCore A" << endl; }};class MultiCoreB: public MultiCore{public:    void Show(){ cout << "MultiCore B" << endl; }};class Factory{public:    virtual SingleCore* CreateSingleCore() = 0;    virtual MultiCore* CreateMultiCore() = 0;};//工厂A,专门用来生产A型号的处理器class FactoryA{public:    SingleCoreA* CreateSingleCore(){ return new SingleCoreA; }    MultiCoreA* CreateMultiCore(){ return new MultiCoreA; }};//工厂B,专门用来生产B型号的处理器class FactoryB{public:    SingleCoreB* CreateSingleCore(){ return new SingleCoreB; }    MultiCoreB* CreateMultiCore(){ return new MultiCoreB; }};

























原创粉丝点击