欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【设计模式】Factory Method模式

程序员文章站 2022-06-15 09:27:36
...

有的书上把工厂模式分为三种:简单工厂、工厂方法和抽象工厂。GOF并没有把简单工厂作为设计模式之一列出。个人觉得简单工厂是工厂方法的一个特例。

 

一、简单工厂(Simple Factory)

作用:专门由一个类来决定实例化哪个产品类。

【设计模式】Factory Method模式

#include <iostream>

using namespace std;

// 产品虚基类
class Product
{
    public:
        virtual ~Product(){}

        virtual void showProduct()=0;
};

// 产品A
class ProductA: public Product
{
    public:
        virtual ~ProductA(){}
        void showProduct() // 重写基类方法
        {
            std::cout << "this is productA" << std::endl;
        }
};


// 产品B
class ProductB: public Product
{
    public:
        virtual ~ProductB(){}
        void showProduct() // 重写基类方法
        {
            std::cout << "this is productB" << std::endl;
        }
};

// 工厂类:我们用该类生成具体的产品
class Factory
{
    public:
        Product *getProduct(int type)
        {
            if(0 == type)
            {
                return new ProductA;
            }
            else if(1 == type)
            {
                return new ProductB;
            }
            else
            {
                std::cout << "sorry i can't create this product" << std::endl;
                return NULL;
            }
        }
};

int main()
{
    Factory* factory = new Factory();
    Product* product1 = factory->getProduct(0);
    Product* product2 = factory->getProduct(1);
    product1->showProduct();
    product2->showProduct();

    return 0;
}

二、工厂方法(Factory Method)

上面提到的简单工厂是由一个类来完成创建产品的工作,我们想要得到某个产品时,需要传递给工厂类一个标识(type),工厂类根据type类型来生成不同的产品。工厂方法在此基础上有所变化,工厂类不想自己做这个工作了,它把自己提升为基类,具体的创建工作交给子类去完成,一般的每个子类只生产一个产品。

【设计模式】Factory Method模式

#include <iostream>

using namespace std;

// 产品虚基类
class Product
{
    public:
        virtual ~Product(){}

        virtual void showProduct()=0;
};

// 产品A
class ProductA: public Product
{
    public:
        virtual ~ProductA(){}
        void showProduct() // 重写基类方法
        {
            std::cout << "this is productA" << std::endl;
        }
};


// 产品B
class ProductB: public Product
{
    public:
        virtual ~ProductB(){}
        void showProduct() // 重写基类方法
        {
            std::cout << "this is productB" << std::endl;
        }
};

// 工厂类
class Factory
{
    public:
        virtual ~Factory() {}
        virtual Product *getProduct() = 0;
};


// 工厂类A:只生产产品A
class FactoryA: public Factory
{
    public:
        virtual ~FactoryA(){}
        Product *getProduct()
        {
            return new ProductA;
        }
};

// 工厂类B:只生产产品B
class FactoryB: public Factory
{
    public:
        virtual ~FactoryB(){}
        Product *getProduct()
        {
            return new ProductB;
        }
};

int main()
{
    Factory* factory1 = new FactoryA();
    Factory* factory2 = new FactoryB();

    Product* product1 = factory1->getProduct();
    Product* product2 = factory2->getProduct();

    product1->showProduct();
    product2->showProduct();

    delete product1;
    delete product2;
    delete factory1;
    delete factory2;

    return 0;
}

三、抽象工厂(Abstract Factory)

上面提到的工厂方法,如果把产品定为汉堡、薯条和可乐,工厂类比成餐厅,用户可能会说给我一个汉堡,一个薯条和一杯可乐,发出三个命令来得到一顿饭。抽象工厂模式可以让用户只发出一个命令即可完成。

【设计模式】Factory Method模式

这里还是用网上一个例子说明:

#include <iostream>

using namespace std;

// 产品虚基类
class Product
{
    public:
        virtual ~Product(){}

        virtual void showProduct()=0;
};

// 产品:床
class ProductBed: public Product
{
    public:
        virtual ~ProductBed(){}
        void showProduct() // 重写基类方法
        {
            std::cout << "this is ProductBed" << std::endl;
        }
};

// 产品:桌子
class ProductDesk: public Product
{
    public:
        virtual ~ProductDesk(){}
        void showProduct() // 重写基类方法
        {
            std::cout << "this is ProductDesk" << std::endl;
        }
};

// 产品:门
class ProductDoor: public Product
{
    public:
        virtual ~ProductDoor(){}
        void showProduct() // 重写基类方法
        {
            std::cout << "this is ProductDoor" << std::endl;
        }
};

// 产品:沙发
class ProductSofa: public Product
{
    public:
        virtual ~ProductSofa(){}
        void showProduct() // 重写基类方法
        {
            std::cout << "this is ProductSofa" << std::endl;
        }
};

// 工厂类
class Home
{
    public:
        virtual ~Home() {}
        virtual void showMyHouse() = 0;
    protected:
        Product *bed;
        Product *desk;
        Product *door;
        Product *sofa;

};


// 工厂子类:只生产简单的家,包括床和门
class SimpleHome: public Home
{
    public:
        SimpleHome()
        {
            bed = new ProductBed();
            door = new ProductDoor();
        }
        virtual ~SimpleHome(){}
        void showMyHouse()
        {
            bed->showProduct();
            door->showProduct();
        }
};

// 工厂子类:生产高级的家,包括床、门、桌子和沙发
class AdvancedHome: public Home
{
    public:
        AdvancedHome()
        {
            bed = new ProductBed();
            door = new ProductDoor();
            desk = new ProductDesk();
            sofa = new ProductSofa();
        }
        virtual ~AdvancedHome(){}
        void showMyHouse()
        {
            bed->showProduct();
            door->showProduct();
            desk->showProduct();
            sofa->showProduct();
        }
};

// 调用工厂的客户类
class Client
{
    public:
        Client(Home * newHome)
        {
            myHome = newHome;
        }

        void showHome()
        {
            myHome->showMyHouse();
        }
    private:
    Home *myHome;
};


int main()
{
    // 一个客户只想要一个简单的家
    Client *A = new Client(new SimpleHome);
    A->showHome();

    // 另一个客户想要一个高级点的家
    Client *B = new Client(new AdvancedHome);
    B->showHome();

    return 0;
}

参考资料:http://www.cnblogs.com/PatrickChen/archive/2009/11/24/1328081.html

                《常见设计模式的解析与C++实现》

 

2011-11-16 任洪彩 aaa@qq.com

转载于:https://my.oschina.net/renhc/blog/37247