设计模式之抽象工厂

一、模式中的角色与职责

抽象工厂(Abstract Factory)角色:它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
具体工厂(Concrete Factory)角色:它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
抽象产品(Abstract Product)角色:它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
具体产品(Concrete Product)角色:它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

二、适用场景

1、系统中有多于一个的产品族。而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。
2、产品等级结构稳定。设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构

三、示例代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;


//抽象苹果
class AbstractApple{
public:
	virtual void ShowName() = 0;
};

//中国苹果
class ChinaApple : public AbstractApple{
public:
	virtual void ShowName(){
		cout << "中国苹果!" << endl;
	}
};

//美国苹果
class USAApple : public AbstractApple{
public:
	virtual void ShowName(){
		cout << "美国苹果!" << endl;
	}
};

//日本苹果
class JapanApple : public AbstractApple{
public:
	virtual void ShowName(){
		cout << "日本苹果!" << endl;
	}
};

//抽象香蕉
class AbsrtactBanana{
public:
	virtual void ShowName() = 0;
};

//中国香蕉
class ChinaBanana : public AbsrtactBanana{
public:
	virtual void ShowName(){
		cout << "中国香蕉!" << endl;
	}
};

//美国香蕉
class USABanana : public AbsrtactBanana{
public:
	virtual void ShowName(){
		cout << "美国香蕉!" << endl;
	}
};

//日本香蕉
class JapanBanana : public AbsrtactBanana{
public:
	virtual void ShowName(){
		cout << "日本香蕉!" << endl;
	}
};


//抽象工厂 针对产品族
class AbstracFactory{
public:
	virtual AbstractApple* CreateApple() = 0;
	virtual AbsrtactBanana* CreateBanana() = 0;
};

//中国工厂
class ChinaFactory : public AbstracFactory{
public:
	virtual AbstractApple* CreateApple(){
		return new ChinaApple;
	}
	virtual AbsrtactBanana* CreateBanana(){
		return new ChinaBanana;
	}
};


//美国工厂
class USAFactory : public AbstracFactory{
public:
	virtual AbstractApple* CreateApple(){
		return new USAApple;
	}
	virtual AbsrtactBanana* CreateBanana(){
		return new USABanana;
	}
};

//日本工厂
class JapanFactory : public AbstracFactory{
public:
	virtual AbstractApple* CreateApple(){
		return new JapanApple;
	}
	virtual AbsrtactBanana* CreateBanana(){
		return new JapanBanana;
	}
};

void test(void){
		
	AbstracFactory* factory = NULL;
	AbstractApple* apple = NULL;
	AbsrtactBanana* banana = NULL;

	//中国工厂
	factory = new ChinaFactory;
	apple = factory->CreateApple();
	banana = factory->CreateBanana();

	apple->ShowName();
	banana->ShowName();

	delete banana;
	delete apple;
	delete factory;
}



int main(void){
	test();
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值