简单工厂 / 工厂方法 / 抽象工厂

本文详细介绍了三种工厂模式:简单工厂、工厂方法及抽象工厂,并对比了它们各自的优缺点。通过具体的代码示例,展示了如何实现这些模式,帮助读者理解并掌握工厂模式在软件设计中的应用。

简单工厂

// 1个工厂对多个产品(简单的工厂模式):工厂根据不同的参数创建对应的产品。
//优点:1.充分利用了多态性,不管什么具体产品都返回抽象产品。2.充分利用了封装性,内部产品发生变化时外部使用这不会受到影响。
//缺点:如果增加了新的产品,就必须的修改工厂,不满足闭合原则(多余的意思是工厂是唯一的)。
class AbstractProdect {//产品类的基类
public:
    virtual void Play() = 0;
};

class AbstractProdectA:public AbstractProdect{
public:
    AbstractProdectA() {
        cout << "AbstractProdectA()" << endl;
    }
    ~AbstractProdectA() {
        cout << "~AbstractProdectA()" << endl;
    }
    void Play() { cout << "I am AbstractProdectA" << endl; }
};

class AbstractProdectB :public AbstractProdect {
public:
    AbstractProdectB() {
        cout << "AbstractProdectB()" << endl;
    }
    ~AbstractProdectB() {
        cout << "~AbstractProdectB()" << endl;
    }
    void Play() { cout << "I am AbstractProdectB" << endl; }
};


class AbstractFactory {//工厂的基类
public:
    AbstractFactory() {};
    ~AbstractFactory() {};
    virtual AbstractProdect* CreateProdect(int) = 0;

};

class Factory1 :public AbstractFactory {
public:
    Factory1() { cout << "Factory1()" << endl; }
    ~Factory1() { cout << "~Factory1()" << endl; }
    AbstractProdect* CreateProdect(int chose)
    {
        AbstractProdect* pd;//指向生产的产品的指针
        switch (chose)
        {
        case 1:pd = new AbstractProdectA(); break;
        case 2:pd = new AbstractProdectB(); break;
        default:pd = NULL; break;
        }
        return pd;
    }


};

工厂方法

/*
工厂方法:有别于简单工厂却是简单工厂的升级。
不同之处、简单工厂是通过参数来控制产品的生产、这里使用的是重载。不同的工厂实现同一个工厂方法生产不同的产品。
、是一个工厂生产一个产品(一对一)。如需增加产品、首先要增加工厂。是一对一的生产模式。
优点:1.充分利用了多态性,不管什么具体产品都返回抽象产品。2.充分利用了封装性,内部产品发生变化时外部使用这不会受到影响。
工厂方法克服了简单工厂的缺点,增加新的产品时,不必修改现存的代码,而只需增加新代码。满足开闭原则。
*/
class Product {//产品的基类(抽象类)
public:
    Product() {}
    ~Product() {}
    virtual void ProBehave() = 0;
};

class productA :public Product {
public:
    productA() {}
    ~productA() {}
    void ProBehave() { cout << "productA " << endl; }
};

class productB :public Product {
public:
    productB() {}
    ~productB() {}
    void ProBehave() { cout << "productB " << endl; }
};

class productC :public Product {
public:
    productC() {}
    ~productC() {}
    void ProBehave() { cout << "productC " << endl; }
};

class Factory {//工厂类的基类(抽象类)
public:
    Factory() {}
    ~Factory() {}
    virtual Product* CreateProduct() = 0;//纯虚函数
};

class factoryA :public Factory {
public:
    factoryA() {}
    ~factoryA() {}
    Product* CreateProduct() { return new productA(); }
};

class factoryB :public Factory {
public:
    factoryB() {}
    ~factoryB() {}
    Product* CreateProduct() { return new productB(); }
};

class factoryC :public Factory {
public:
    factoryC() {}
    ~factoryC() {}
    Product* CreateProduct() { return new productC(); }
};

抽象工厂

/*
抽象工厂: 简单工厂+工厂方法(可以是多对多)
优点差不多是这两个优点的集合。
*/

class ProductA
{
public:
    ProductA()
    {}
    virtual ~ProductA()
    {}
public:
    virtual void operation() = 0;
};
class ProductA1 : public ProductA
{
public:
    ProductA1()
    {}
    virtual ~ProductA1()
    {}
public:
    virtual void operation()
    {
        cout << "ProductA1" << endl;
    }
};
class ProductA2 : public ProductA
{
public:
    ProductA2()
    {}
    virtual ~ProductA2()
    {}
public:
    virtual void operation()
    {
        cout << "ProductA2" << endl;
    }
};
class ProductB
{
public:
    ProductB()
    {}
    virtual ~ProductB()
    {}
public:
    virtual void operation() = 0;
};
class ProductB1 : public ProductB
{
public:
    ProductB1()
    {}
    virtual ~ProductB1()
    {}
public:
    virtual void operation()
    {
        cout << "ProductB1" << endl;
    }
};
class ProductB2 : public ProductB
{
public:
    ProductB2()
    {}
    virtual ~ProductB2()
    {}
public:
    virtual void operation()
    {
        cout << "ProductB2" << endl;
    }
};

class AbstractFactory
{
public:
    AbstractFactory()
    {}
    virtual ~AbstractFactory()
    {}
public:
    virtual ProductA* createProductA() = 0;
    virtual ProductB* createProductB() = 0;
};
class Factory1 : public AbstractFactory
{
public:
    Factory1()
    {}
    ~Factory1()
    {}
public:
    ProductA* createProductA()
    {
        return new ProductA1();
    }
    ProductB* createProductB()
    {
        return new ProductB1();
    }
};
class Factory2 : public AbstractFactory
{
public:
    Factory2()
    {}
    ~Factory2()
    {}
public:
    ProductA* createProductA()
    {
        return new ProductA2();
    }

    ProductB* createProductB()
    {
        return new ProductB2();
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值