抽象工厂模式C++实现
1定义
为创建一组相关或者依赖的对象提供一个接口,且无需指定他们的具体类
2类图
3实现
class AbstractProduct
{
protected:
AbstractProduct(){}
public:
void SharedThing()
{ //实现产品的共性功能}
//每个产品都有的功能,具体实现有差异
virtual SomeThing() = 0;
virtual ~AbstractProduct()=0;
};
//两种不同的产品(抽象层)
class AbstactProductA:public AbstractProduct
{};
class AbstactProductB:public AbstractProduct
{};
//产品纵向分化,eg对于已经确定的中国人,日本人,又要区分男女了。
class ProductA1:public AbstractProductA
{};
class ProductA2:public AbstractProductA
{};
class ProductB1:public AbstractProductB
{};
class ProductB2:public AbstractProductB
{};
class AbstractCreator
{
protected:
AbstractCreator(){}
public:
virtual AbstractProductA* CreatProductA()=0;
virtual AbstractProductB* CreatProductB()=0;
virtual ~AbstractCreator()=0;
};
class Creator1:public AbstractCreator
{
AbstractProductA* CreatProductA()
{
return new ProductA1();
}
AbstractProductB* CreatProductB()
{
return new ProductB1();
}
};
class Creator2:public AbstractCreator
{
AbstractProductA* CreatProductA()
{
return new ProductA2();
}
AbstractProductB* CreatProductB()
{
return new ProductB2();
}
};
注:看到类图,你可能会很困惑,这个和工厂模式的类图是没区别的。那么如何区分这两个模式呢。
细读定义
工厂模式:为一类产品定义其实例化操作
抽象工厂:为一组相关或者依赖的产品定义实例化。
一类表明在产品方向上,他们是横向,同级存在的。eg学院的各专业
一组说明则是产品方向上,是纵向分化的,新增的分化。eg专业的具体分班:1,2,3
讨论<借鉴《设计模式C++实现》>
AbstractFactory 模式和 Factory 模式的区别是初学(使用)设计模式时候的一个容易引
起困惑的地方。 实际上, AbstractFactory 模式是为创建一组( 有多类) 相关或依赖的对象提
供创建接口, 而 Factory 模式正如我在相应的文档中分析的是为一类对象提供创建接口或延
迟对象的创建到子类中实现。并且可以看到, AbstractFactory 模式通常都是使用 Factory 模
式实现( ConcreteFactory1)
4应用
①优点:封装性;产品族内的约束为非公开状态:eg 产品分化的比例(专业内各班级人数平衡)这个问题对于客户是透明的,非公开的
②缺点:产品族扩展困难,每增加一个产品C,就必须在抽象类AbstractCreator中增加对应的方法,同时在每一个具体的工厂方法中加入对应代码,这违反了开闭原则。
5使用场景
一个对象族(或一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。
6注意事项
提示:对于抽象工厂模式的缺点
扩展性差说的是产品族扩展困难而不是产品等级。
或者说横向容易,纵向难。
或者说产品末端结点扩展容易(1,2,3),中间难(ABC)
或者说抽象层的扩展难,具象层扩展容易(依赖倒置原则)
7个人理解
抽象工厂模式和工厂模式其实主要是以提供未知类型实例化接口为主。
而当工厂模式中的产品层需要进一步划分时(区分性别),那就将上层工厂抽象化,而后实例化终端工厂。
所以,对于工厂模式和抽象工厂模式的区分理解重点在于理解“产品族”“产品等级”两个概念。