设计模式-工厂方法模式

工厂方法模式

工厂方法模式应用场景

专门的工厂实现专门一类的产品。

能解决简单工厂的创建方法中增加产品就要增加新的if-else的问题,解决这种做法带来的扩展性差,违背开闭原则,和影响到可读性等问题。

工厂方法模式实现要点

工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成。其基本结构如下。

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。

  • 具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。

  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。

  • 具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

代码实现

cpp 复制代码
#include <iostream>
#include <string>

using namespace std;

class Product
{
public:
    virtual void MethodName()
    {
        //公共方法的实现
    }
    virtual void work() = 0;
    //声明抽象业务方法
};

class ConcreteProductA : public Product
{
public:
    void MethodName()
    {
        cout << "我是海尔牌-洗衣机." << endl;
    }

    void work()
    {
        //业务方法的实现
        cout << "我是小海洗,我能洗刷刷..." << endl;
    }
};

class ConcreteProductB : public Product
{
public:
    void MethodName()
    {
        cout << "我是海尔牌-空调." << endl;
    }
    
    void work()
    {
        //业务方法的实现
        cout << "我是小海空,我让你凉爽爽..." << endl;
    }
};

class FactoryBase
{
public:
    FactoryBase() {}
    ~FactoryBase() {}

    virtual Product* GetProduct() = 0;
};


class AFactory: public FactoryBase
{
public:
    AFactory() {}
    ~AFactory() {}

    Product* GetProduct()
    {
        return new ConcreteProductA();
    }
};

class BFactory : public FactoryBase
{
public:
    BFactory() {}
    ~BFactory() {}

    Product* GetProduct()
    {
        return new ConcreteProductB();
    }
};



int main()
{
	string type;
	Product* productA = nullptr;
    Product* productB = nullptr;
	cout << "请输入要创建的产品类型:" << endl;

    FactoryBase* factoryA = new AFactory();
    FactoryBase* factoryB = new BFactory();
	
	productA = factoryA->GetProduct();//工厂A类创建对象
	productA->MethodName();
	productA->work();

    productB = factoryB->GetProduct();//工厂B类创建对象
    productB->MethodName();
    productB->work();
}

工厂方法模式的缺点

  • 每增加一种产品,就需要增加一个对象的工厂。如果这家公司发展迅速,推出了很多新的产品,那么每一个产品就要开设相应的新工厂。那么,我们在C++实现中,就要定义与产品同等数量的工厂类。显然,相比简单工厂模式,工厂方法模式需要更多的类定义。这样会使得系统中类的个数成倍增加,增加了代码的复杂度。
相关推荐
唐僧洗头爱飘柔95273 小时前
(Java并发编程——JUC)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
java·设计模式·并发编程·juc·reentrantlock·顺序控制·生产者与消费者
澄澈i4 小时前
设计模式学习[9]---模板方法模式
c++·学习·设计模式·模板方法模式
zzzhpzhpzzz4 小时前
设计模式——解释器模式
算法·设计模式·解释器模式
DBWYX5 小时前
GoF设计模式——结构型设计模式分析与应用
设计模式
repinkply6 小时前
装饰模式(Decorator)模式:装饰模式/包装模式,结构模式
设计模式·c++设计模式·装饰器模式·装饰模式·包装模式
霁月风7 小时前
设计模式——装饰器模式
c++·设计模式·装饰器模式
夏旭泽7 小时前
设计模式-原型模式
设计模式·原型模式
zzzhpzhpzzz8 小时前
设计模式——观察者模式
算法·观察者模式·设计模式
小白不太白9509 小时前
设计模式之 迭代器模式
java·设计模式·迭代器模式
闲人一枚(学习中)9 小时前
设计模式-创建型-单例模式
java·单例模式·设计模式