简单工厂模式&&工厂方法模式

参考:三种工厂模式的C++实现

1.简单工厂模式

要理解这个模式,需要预设一个条件,就是子类(XSLsoap,SFJsoap)的实现,与main中去调用factory的是2个人。。

抽象出一个肥皂工厂(soapBase)父类,然后具体的子类(XSLsoap,SFJsoap)去继承父类。。。在通过具体工厂类(Factory)去写代码的地方进行调用。

优点:相比直接去创建子类(XSLsoap,SFJsoap),调用Factory去创建子类,比较解耦,能够比较少的去改变main中代码。

缺点:当添加子类,Factory需要修改。。很繁琐。。而且本质上是对switch--case的封装,感觉意义不大。。感觉不是特别的好。

// 简单工厂模式
// 通过factory去创建不同的具体类---本质上还是switch,case
// 缺点很明显--添加一个子类就需要修改soapBase,不符合开闭原则

#include "iostream"
using namespace std;

enum Product {SFJ,XSL};

class soapBase {
    public:
    virtual ~soapBase() {};
    virtual void show() = 0;
};

class SFJsoap:public soapBase {
    public:
    void show() {cout << "SFJ" << endl;}
};

class XSLsoap:public soapBase {
    public:
    void show() {cout << "XSL" << endl;}
};

class Factory {
    public:
    soapBase* createSoap(Product type) {
        switch (type)
        {
            case SFJ:
                return new SFJsoap();
                break;

            case XSL:
                return new XSLsoap();
                break;           
        }
    }
};

int main()
{
    Factory factory;
    soapBase* soap1 = factory.createSoap(SFJ);
    soap1->show();

    soapBase* soap2 = factory.createSoap(XSL);
    soap2->show();
}

2.工厂方法模式

这个模式感觉就是抽象工厂(abstractfactory)定义一个创建产品函数:这个函数返回抽象香皂类(soapbase* createSoap(); )。

而调用,则是通过多态创建具体的工厂类,而去调用复写的接口,把多态运用的淋漓尽致。。

// 工厂方法模式
// 工厂方法模式
 
#include <iostream>
using namespace std;

class soapBase
{
	public:
	virtual ~soapBase(){};
	virtual void show() = 0;
};

class NASSoap:public soapBase
{
	public:
	void show() {cout<<"NAS Soap!"<<endl;}
};

class abstractFactory {
public:
	virtual soapBase * creatSoap() = 0;
};

class FactoryNASSoap : public abstractFactory
{
public:
	virtual soapBase * creatSoap()
	{
        return new NASSoap();
	}
};
 
int main()
{
    abstractFactory* factory = new FactoryNASSoap();
    soapBase* soap = factory->creatSoap();

    soap->show(); 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值