C++ 工厂模式(原理+代码)

工厂模式使用了多态模式的特性,将存在继承关系的类,通过一个工厂类创建对应的子类对象,在项目复杂的情况下,这样建工厂比较方便。
工厂模式分为简单工厂模式、工厂方法模式、抽象工厂模式

简单工厂模式的结构组成
1.抽象产品类:具体产品类继承的父类和实现的接口
2.具体产品类:工厂类所创建的对象
3.工厂类:工厂模式的核心类,用于创建具体产品类的实例对象

简单工厂模式的缺点:
扩展性有限,当需要增加新的产品类时,需要修改工厂类中的生成产品接口。

#include <iostream>
//抽象产品类
class Product
{
public:
	virtual ~Product(){};
	virtual void show()=0;
};
//具体产品类1
class Product_1 :public Product
{
public:
	void show()
	{
		std::cout << "这是产品1" << std::endl;
	};
};

//具体产品类2
class Product_2 :public Product
{
public:
	void show()
	{
		std::cout << "这是产品2" << std::endl;
	};
};
enum  ProductType
{
	first,
	scecond
};


//工厂类
class Factory
{

public:
	Product* CreateProduct(ProductType type)
	{
		switch (type)
		{
		case first:
			return new Product_1();
		case scecond:
			return new Product_2();
		default:
			return NULL;
		break;
		}
	};
};

int main()
{
	//构建工厂对象
	Factory factory;
	Product* productOne = factory.CreateProduct(first);
	if (productOne !=NULL)
	{
		productOne->show();
		delete productOne;
		productOne = NULL;
	}
	
	Product* productTwo = factory.CreateProduct(scecond);
	if (productTwo != NULL)
	{
		productTwo->show();
		delete productTwo;
		productTwo = NULL;
	}

}

 

工厂模式的组成:
1.抽象产品类:具体产品类的基类
2.具体产品类:具体工厂类产生的类
3.抽象工厂类:工厂模式的核心类,具体工厂模式的基类,提供创建具体产品的接口,有具体工厂类实现
4.具体工厂类:继承于抽象工厂类,用于创建具体产品对象

工厂方法模式的缺点:
1.一条生成线只能生产一种产品
2.每增加一种产品,就需要增加一种具体产品类和具体工厂类

/抽象产品类
#include<iostream>
using  namespace std;
class Product
{
public:
    virtual ~Product() {};
    virtual  void show() = 0;
};
//具体产品1
class Product_1:public Product
{
public:
    void show()
    {
        std::cout << "工厂模式,产品1" << std::endl;
    };

};

//具体产品2
class Product_2 :public Product
{
public:
    void show()
    {
        std::cout << "工厂模式,产品2" << std::endl;
    };

};

//抽象工厂类
class factory
{
public:
    virtual ~factory() {};
    virtual Product* createProduct()= 0;
};
//具体工厂类1
class factoryOne :public factory
{
public:
    Product* createProduct()
    {
        return new Product_1();
    };
};

//具体工厂类2
class factoryTwo :public factory
{
public:
    Product* createProduct()
    {
        return new Product_2();
    };
};

int main()
{
    //生产产品1的流程。。。。。。
    //产品1的生成工厂
    factoryOne* factory1 = new factoryOne();
    //工厂1生产产品1
    Product *product1  = factory1->createProduct();
    //产品1展示
    product1->show();

    //生产产品2的流程。。。。。。
    //产品2的生成工厂
    factoryTwo* factory2 = new factoryTwo();
    //工厂1生产产品1
    Product* product2 = factory2->createProduct();
    //产品1展示
    product2->show();

    //记得析构一下

}

抽象工厂模式

抽象产品类:具体产品类的基类
具体产品类:具体工厂所创建的对象
抽象工厂类:工厂方法模式的核心类,提供创建具体产品的接口,有具体工厂类实现
具体工厂类:继承于抽象工厂类,实现创建对应具体产品对象的方式

抽象工厂模式的特点:
提供一个接口,可以创建多个产品族中的产品对象

 

/抽象产品类
//抽象产品tea(茶)
#include <iostream>
class tea
{
public:

    virtual ~tea() {};
    virtual void show() = 0;
};
//具体产品 greenTea(绿茶)
class greenTea :public tea
{
public:
    void show()
    {
        std::cout << "这是工厂生产的绿茶"<<std::endl;
    }
};

//抽象产品类 coffee
class coffee
{
public:
    virtual ~coffee() {};
    virtual void show() = 0;
};

//具体产品类 whitecoffee (白咖啡)
class whitecoffee :public coffee
{
public:
    void show()
    {
        std::cout << "这是工厂生产的白咖啡" << std::endl;
    }
};

//抽象工厂
class factory
{
public:
    virtual~factory() {};
    virtual tea* createtea()=0;
    virtual coffee* createCoffee() = 0;
};
//具体工厂类 (生产绿茶和白咖啡)
class myfactory :public factory
{
public:
    tea* createtea()
    {
        return new greenTea();
    };

    coffee* createCoffee()
    {
        return new whitecoffee();
    }
};


int main()
{
    myfactory fac;
    tea* myTea = fac.createtea();
    coffee* mycoffee  =fac.createCoffee();
    myTea->show();
    mycoffee->show();
    delete myTea;
    delete mycoffee;
    myTea = NULL;
    mycoffee = NULL;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值