浅学一下【设计模式】之 [ 抽象工厂模式 ]

24 篇文章 2 订阅
4 篇文章 0 订阅

浅学一下【设计模式】

第三个练习:抽象工厂模式

其实,工厂模式我们也能看到会有这样的一个问题,如果我们有两个具体产品类,那我们就有两个生产具体产品类的工厂类,那当我们有很多具体产品类时,就会增加系统中工厂类的个数。这个时候,可以考虑有一个总工厂类,去生产属于“一个产品族”的产品,这个就是抽象工厂模式的基本思想。

练习:
某公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化,为了保护版权,该皮肤库源代码不打算公开。用户在使用时通过菜单来选择皮肤,不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构示意图如下图所示:
在这里插入图片描述

产品等级与产品族

  • 产品等级结构:即产品的继承结构,比如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象手机类是基类,而具体品牌的手机是其派生类。
  • 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,比如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。

抽象工厂模式结构如下:
抽象工厂模式结构
在抽象工厂模式结构图中包含如下几个角色:

   ● AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。

   ● ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。

   ● AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。

   ● ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

示例具体实现:

#include <iostream>
using namespace std;
#include<string>

//抽象产品:按钮类
class Button
{
public:
	virtual void display()= 0;
};

//具体产品:A类按钮
class ButtonA :public Button
{
public:
	void display()
	{
		cout << "显示A类型按钮" << endl;
	}
};

//具体产品:B类按钮
class ButtonB :public Button
{
public:
	void display()
	{
		cout << "显示B类型按钮" << endl;
	}
};

//抽象产品:文本框类
class TextField
{
public:
	virtual void display() = 0;
};

//具体产品:A类文本框
class TextFieldA :public TextField
{
public:
	void display()
	{
		cout << "显示A类型文本框" << endl;
	}
};

//具体产品:B类文本框
class TextFieldB :public TextField
{
public:
	void display()
	{
		cout << "显示B类型文本框" << endl;
	}
};

//抽象产品:组合框类
class ComboBox
{
public:
	virtual void display() = 0;
};

//具体产品:A类组合框
class ComboxBoxA :public ComboBox
{
public:
	void display()
	{
		cout << "显示A类型组合框" << endl;
	}
};

//具体产品:B类组合框
class ComboxBoxB :public ComboBox
{
public:
	void display()
	{
		cout << "显示B类型组合框" << endl;
	}
};


//抽象工厂:皮肤工厂类
class SkinFactory
{
public:
	virtual Button* createButton() = 0;
	virtual TextField* createTextField() = 0;
	virtual ComboBox* createComboBox() = 0;

};

//具体工厂:A类型皮肤工厂
class SkinFactoryA :public SkinFactory
{
public:
	Button* createButton()
	{
		return new ButtonA();
	}

	TextField* createTextField()
	{
		return new TextFieldA();
	}

	ComboBox* createComboBox()
	{
		return new ComboxBoxA();
	}
};

//具体工厂:B类型皮肤工厂
class SkinFactoryB :public SkinFactory
{
public:
	Button* createButton()
	{
		return new ButtonB();
	}

	TextField* createTextField()
	{
		return new TextFieldB();
	}

	ComboBox* createComboBox()
	{
		return new ComboxBoxB();
	}
};



int main()
{
	//使用抽象层定义
	SkinFactory* factory = NULL;
	Button* but = NULL;
	TextField* tex = NULL;
	ComboBox* com = NULL;

	//A类型皮肤
	factory = new SkinFactoryA();
	but = factory->createButton();
	but->display();
	tex = factory->createTextField();
	tex->display();
	com = factory->createComboBox();
	com->display();


	//A类型皮肤
	factory = new SkinFactoryB();
	but = factory->createButton();
	but->display();
	tex = factory->createTextField();
	tex->display();
	com = factory->createComboBox();
	com->display();

	return 0;
}

实现效果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值