大运天成赖搏击

进步最重要

导航

设计模式学习-每日一记(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.且当产品类别很多时,简单工厂不是很适用.

posted on 2011-10-24 14:42  linucos  阅读(217)  评论(0编辑  收藏  举报