创建型之工厂方法模式C++实现

2022-06-16 15:05:27 浏览数 (1)

工厂方法模式:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。“创建与使用相分离”。

优点:

1.用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;

2.在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;

缺点:

每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,增加了系统的复杂度。

主要角色:

  1. 抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
  2. 具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  3. 抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
  4. 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应.

具体示例:

手机厂生产手机,电视厂生产电视

第一步:抽象产品

代码语言:javascript复制
//抽象产品
class Product
{
    public:
        virtual void show()=0;
};

第二步:具体产品

代码语言:javascript复制
//具体产品1
class ConProduct1:public Product
{
    public:
        void show()
        {
            cout<<"手机产品生产完成"<<endl;
        }
};
//具体产品2
class ConProduct2:public Product
{
    public:
        void show()
        {
            cout<<"电视产品生产完成"<<endl;
        }
};

第三步:抽象工厂

代码语言:javascript复制
//抽象工厂类
class Factory
{
    public:
    //此处只能返回一个抽象类的指针,抽象类不能返回实体
        virtual Product* newProduct()=0;
};

第四步:具体工厂

代码语言:javascript复制
//具体工厂1,实现产品1的生产
class ConFactory1:public Factory
{
    public:
        Product* newProduct()
        {
            cout<<"手机厂生产手机"<<endl;
            return new ConProduct1();
        }
};

//具体工厂2,实现产品2
class ConFactory2:public Factory
{
    public:
        Product* newProduct()
        {
            cout<<"电视厂生产电视"<<endl;
            return new ConProduct2();
        }
};

第五步:主函数

代码语言:javascript复制
#include "p.h"

int main()
{
    
        Product *P1=new ConProduct1();
        Product *P2=new ConProduct2();
        Factory *PF1=new ConFactory1();
        Factory *PF2=new ConFactory2();
        P1=PF1->newProduct();
        P1->show();
        P2=PF2->newProduct();
        P2->show();

        return 0;
    
}

结果显示:

0 人点赞