浅学一下【设计模式】
第三个练习:抽象工厂模式
其实,工厂模式我们也能看到会有这样的一个问题,如果我们有两个具体产品类,那我们就有两个生产具体产品类的工厂类,那当我们有很多具体产品类时,就会增加系统中工厂类的个数。这个时候,可以考虑有一个总工厂类,去生产属于“一个产品族”的产品,这个就是抽象工厂模式的基本思想。
练习:
某公司欲开发一套界面皮肤库,可以对桌面软件进行界面美化,为了保护版权,该皮肤库源代码不打算公开。用户在使用时通过菜单来选择皮肤,不同的皮肤将提供视觉效果不同的按钮、文本框、组合框等界面元素,其结构示意图如下图所示:
产品等级与产品族:
- 产品等级结构:即产品的继承结构,比如一个抽象类是电视机,其子类有海尔电视机、海信电视机、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;
}
实现效果: