设计模式——工厂模式(C++)——算法实现

工厂模式: 对简单工厂模式的进一步抽象和推广,保持了简单工厂模式的优点,而且克服了简单工厂模式的缺点,可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
意图: 把对象实例化的动作提取出来,和主项目的过程或者方法的依赖关系进行解耦,通过这种方式来使整个项目、工程能够有更好的扩展性和维护性。工厂模式就是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
主要解决: 构造工厂对象,将构造的工作交给工厂。在工厂对象里针对具体实现new。换句话说,并不是解决垃圾而是将垃圾收集起来。
何时使用: 我们明确地计划不同条件下创建不同实例时。
如何解决: 让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码: 抽象工厂、具体工厂、抽象产品和具体产品的实现。
优点:

1.用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
2.灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
3.典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

缺点:

1.类的个数容易过多,增加复杂度
2.增加了系统的抽象性和理解难度
3.抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。

#include <iostream>

using namespace std;

//抽象产品角色:它是具体产品继承的父类或者是实现的接口。
class AbstractProduct
{
    public:
        virtual void Show()
        {
            cout<<"抽象产品"<<endl;
        }
};

//具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
class ConcreateProductA:public AbstractProduct
{
    public:
        virtual void Show()
        {   
            cout<<"生产产品A......"<<endl;
        }
};

//具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
class ConcreateProductB:public AbstractProduct
{
    public:
        virtual void Show()
        {   
            cout<<"生产产品B......"<<endl;
        }
};

//抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
class  AbstractFactory
{
    public:
        virtual  AbstractProduct* CreateProduct()=0;
};

//具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
class FactoryA:public AbstractFactory
{
    public:
        virtual AbstractProduct* CreateProduct()
        {
            cout<<"具体工厂A生成-->具体产品A"<<endl;
            return new ConcreateProductA();
        }
};

//具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
class FactoryB:public AbstractFactory
{
    public:
        virtual AbstractProduct* CreateProduct()
        {
            cout<<"具体工厂B生成-->具体产品B"<<endl;
            return new ConcreateProductB();
        }
};

int main()
{
    AbstractFactory* factory = new FactoryA();
    AbstractProduct* product = factory->CreateProduct();

    product->Show();
    system("pause");
    return 0;
}
工厂模式集中封装了对象的创建,使得要更换对象时,不需要做太大的改动就可实现,降低了客户程序与产品对象的耦合度。
工厂模式把简单工厂模式内部逻辑判断转移到客户端代码来进行。你想要加功能,本来是改工厂类的switch…case,而现在是修改客户端!
学习来源:《大话设计模式》、《菜鸟教程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值