C++设计模式---工厂模式

工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式

  • 作用:封装对象的创建,分离对象的创建和操作过程,用于批量管理对象的创建过程,便于程序的维护和扩展。

简单工厂模式:主要特点是需要在工厂类中做判断,从而创造相应的产品,当增加新产品时,需要修改工厂类。

typedef enum{
    TypeA;
    TypeB;
}Productype;

class Product{
public:
    virtual void message() = 0;
};

class ProductA:class Product{
public:
    void message(){
        cout<<"I'm ProductA !"<<endl;
    }
};

class ProductB:class Product{
public:
    void message(){
        cout<<"I'm ProductB !"<<endl;
    }
};

class Factory{
public: 
    Product* createProduct(Productype type){
        switch(type){
            case TypeA:
                return new ProductA;
            case TypeB:
                return new ProductB;
            default:
                return NULL;
        }
    }
};

工厂方法模式:是指定义一个创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到其子类。

主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
缺点:每增加一种产品,就需要增加一个对象工厂。相比简单工厂模式,工厂方法模式需要定义更多的类。

class Product{
public:
    virtual void message() = 0;
};

class ProductA:class Product{
public:
    void message(){
        cout<<"I'm ProductA !"<<endl;
    }
};

class ProductB:class Product{
public:
    void message(){
        cout<<"I'm ProductB !"<<endl;
    }
};

class Factory{
public: 
    virtual Product* createProduct() = 0;
};

class FactoryA:class Factory{
public:
    Product* createProduct(){
        return new ProductA;
    }
};

class FactoryB:class Factory{
public:
    Product* createProduct(){
        return new ProductB;
    }
};

抽象工厂模式:提供一个创建一系列相关或相互依赖的对象接口,而无需指定它们的具体类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

class ProductA{
public:
    virtual void message() = 0;
};

class ProductA1:class ProductA{
public:
    void message(){
        cout<<"I'm ProductA1 !"<<endl;
    }
};

class ProductA2:class ProductA{
public:
    void message(){
        cout<<"I'm ProductA2 !"<<endl;
    }
};

class ProductB{
public:
    virtual void message() = 0;
};

class ProductB1:class ProductA{
public:
    void message(){
        cout<<"I'm ProductB1 !"<<endl;
    }
};

class ProductB2:class ProductA{
public:
    void message(){
        cout<<"I'm ProductB2 !"<<endl;
    }
};


class Factory{
public: 
    virtual Product* createProductA() = 0;
    virtual Product* createProductB() = 0;
};

class Factory1:class Factory{
public:
    Product* createProductA(){
        return new ProductA1;
    }

    Product* createProductB(){
        return new ProductB1;
    }
};

class Factory2:class Factory{
public:
    Product* createProductA(){
        return new ProductA2;
    }

    Product* createProductB(){
        return new ProductB2;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_37160123/article/details/89454273