设计模式笔记之---抽象工厂模式

抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

       抽象工厂模式最大的好处是便于交换产品系列,由于具体工厂类只在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体的工厂即可使用不同的产品配置。同时,它让具体的创建实例的过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中,从而完全遵循了开发--封闭原则和依赖倒装原则。

UML类图:

                   

抽象工厂模式基本代码如下:

/********************************************************************
filename: 	AbstractFactory.h
created:	2012-09-24
author:		firehood

purpose:	firehood 学设计模式之---抽象工厂模式
*********************************************************************/
#pragma once
#include <iostream>  
using namespace std;  

// 抽象产品A
class AbstractProductA
{
public:
	AbstractProductA(void){}
	virtual ~AbstractProductA(void){}
};

// 具体产品A1,抽象产品A的第一种实现
class ConcreteProductA1:public AbstractProductA
{
public:
	ConcreteProductA1(void)
	{  
		cout<<"生产产品A1"<<endl;  
	}  
	virtual ~ConcreteProductA1(void)
	{  
		cout<<"销毁产品A1"<<endl;  
	}  
};

// 具体产品A2,抽象产品A的第二种实现
class ConcreteProductA2:public AbstractProductA
{
public:
	ConcreteProductA2(void)
	{  
		cout<<"生产产品A2"<<endl;  
	}  
	virtual ~ConcreteProductA2(void)
	{  
		cout<<"销毁产品A2"<<endl;  
	}  
};

// 抽象产品B
class AbstractProductB
{
public:
	AbstractProductB(void){}
	virtual ~AbstractProductB(void){}
};

// 具体产品B1,抽象产品B的第一种实现
class ConcreteProductB1:public AbstractProductB
{
public:
	ConcreteProductB1(void)
	{  
		cout<<"生产产品B1"<<endl;  
	}  
	virtual ~ConcreteProductB1(void)
	{  
		cout<<"销毁产品B1"<<endl;  
	}  
};

// 具体产品B2,抽象产品B的第二种实现
class ConcreteProductB2:public AbstractProductB
{
public:
	ConcreteProductB2(void)
	{  
		cout<<"生产产品B2"<<endl;  
	}  
	virtual ~ConcreteProductB2(void)
	{  
		cout<<"销毁产品B2"<<endl;  
	}  
};

// 抽象工厂
class AbstractFactory
{
public:
	AbstractFactory(void){}
	virtual ~AbstractFactory(void){}
	virtual AbstractProductA* CreateProductA() = 0;
	virtual AbstractProductB* CreateProductB() = 0;
};

// 具体工厂1
class ConcreteFactory1:public AbstractFactory
{
public:
	ConcreteFactory1(void)
	{  
		cout<<"创建工厂1"<<endl;  
	}  
	virtual ~ConcreteFactory1(void)
	{  
		cout<<"销毁工厂1"<<endl;  
	}  
	virtual AbstractProductA* CreateProductA()
	{
		// 创建产品A1
		return new ConcreteProductA1();
	}
	virtual AbstractProductB* CreateProductB()
	{
		// 创建产品B1
		return new ConcreteProductB1();
	}
};

// 具体工厂2
class ConcreteFactory2:public AbstractFactory
{
public:
	ConcreteFactory2(void)
	{  
		cout<<"创建工厂2"<<endl;  
	}  
	virtual ~ConcreteFactory2(void)
	{  
		cout<<"销毁工厂2"<<endl;  
	}  
	virtual AbstractProductA* CreateProductA()
	{
		// 创建产品A2
		return new ConcreteProductA2();
	}
	virtual AbstractProductB* CreateProductB()
	{
		// 创建产品B2
		return new ConcreteProductB2();
	}
};
客户端调用代码如下:

#include "AbstractFactory.h"
#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
	cout<<"*************************************"<<endl;
	cout<<"firehood 学设计模式之---抽象工厂模式"<<endl;
	cout<<"*************************************"<<endl;
    AbstractFactory *factory = new ConcreteFactory1();
	//AbstractFactory *factory = new ConcreteFactory2();
    AbstractProductA *productA = factory->CreateProductA();
	AbstractProductB *productB = factory->CreateProductB();

	delete productA;
	delete productB;
	delete factory;
    system("pause");
	return 0;
}
运行结果如下:

*************************************
firehood 学设计模式之---抽象工厂模式
*************************************
创建工厂1
生产产品A1
生产产品B1
销毁产品A1
销毁产品B1
销毁工厂1
请按任意键继续. . .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值