设计模式学习-每日一记(1.简单工厂模式)
简单工厂模式
A.定义:
定义一个用于创建对象的接口.
B.定义分析:
"定义一个用于创建对象的接口". 这个模式的应用主要是定义一个接口,每个类都会有接口,对于面向对象语言就是定义一个类,这个类里有个接口.
"定义一个用于创建对象的接口".定义的这个类中含有的接口,是什么功能呢?用于创建对象.什么样的接口叫做用于创建对象的接口呢?比如:SimpleFactory类的newProduct接口这样实现:
AbstractProduct* SimpleFactory::newProduct(const char* name) {
if(0 == strcmp(name, "A")) {
return new ConcreteProductA();
}
}
newProduct就是创建对象的接口,也就是把new的过程拿到了newProduct接口中.
C.问题
(1)为什么要把对象new的过程拿到newProduct这样的简单工厂类的接口里?直接在使用的代码处new一个对象不行吗?
直接在代码里new一个对象是可以的.问题是
如果ConcreteProductA这个类的名字修改了呢?所有用到ConcreteProductA类的代码都要修改;
如果ConcreteProductA的使用并不合理呢?所有用到ConcreteProductA类的代码都要修改;
如果客户并不知道ConcreteProductA这个类的名字或者我们不想客户知道ConcreteProductA的实现细节呢?
...诸如此类的重构或者设计问题.
所有这些问题的根源在于,ConcreteProductA相关会发生变化,发生变化时,系统的灵活性不够,会造成重构的困难.
解决办法是:不让客户知道 ConcreteProductA的存在,只需要使用AbstractProduct提供的接口,具体的product类通过工厂接口类创建.这样客户代码和具体product没有任何依赖了,也就不存在重构上的问题.
(2)可以不定义类,只使用newProduct这样的接口不?
可以的.但是有些语言是不能有全局方法的,只能用类这样的形式.
(3)简单工厂有没有什么弊端?
有的.当新增了产品类型时,需要更改工厂接口newProduct.且当产品类别很多时,简单工厂不是很适用.