关于抽象工厂的一个问题?

02-11-11 追风
看了bang的抽象工厂介绍,有一个问题不清楚。还请大家帮忙解决一下:

bang的抽象工厂中指出如果有2种产品,并且每种产品又有不同的实现,可以使用抽象工厂模式,但按bang的介绍,如果后来再增加一种新的产品,那所有的类是不是都要修改。

lsj
2002-11-11 12:00
使用抽象工厂需要两个接口:产品接口和工厂接口,我们是面向接口编程

新增加的产品要实现产品接口,其他类可以继续以原有方式工作

richardluopeng
2002-11-12 13:22
工厂和抽象工厂是有区别的

jxb8901
2002-11-13 09:30
但是Gof的设计模式中只提到Abstract Factory模式而没有什么Factory模式,

楼上指的是Factory Method吗? 这两者当然是不同的!

vic
2002-11-21 10:01
简单点来说,假设我先定义了一套bbs的接口在那里

你以数据库存储的形式实现,这是一个产品

你也可以以文件存储的形式实现,这是另一个产品

同理,你可以实现多个产品,注意,产品之间只是

实现方式不同,接口都是一样的

crazyren
2002-11-29 09:54
抽象工厂当然也有其限制,并不是万能的。

比如

产品分为两个等级结构 A 和 B,和两个产品族 1 和 2

/** 工厂接口 */

public interface Creator {

public ProductA factoryA();

public ProductB factoryB();

}

/** 具体工厂1 */

public class ConcreteCreator1 implements Creator {

public ProductA factoryA() { return new ProductA1();}

public ProductB factoryB() { return new ProductB1();}

}

/** 具体工厂2 */

public class Factory2 implements Factory {

public ProductA factoryA() { return new ProductA2();}

public ProductB factoryB() { return new ProductB2();}

}

/** 产品接口A */

public interface ProductA { }

/** 产品接口B */

public interface ProductB { }

/** 具体产品A1 */

public class ProductA1 implements ProductA {

public ProductA1() {}

}

/** 具体产品A2 */

public class ProductA2 implements ProductA {

public ProductA2() {}

}

/** 具体产品B1 */

public class ProductB1 implements ProductB {

public ProductB1() {}

}

/** 具体产品B2 */

public class ProductB2 implements ProductB {

public ProductB2() {}

}

如果系统添加一个新的产品族,比如说 3 ,是很方便的。

但是如果在每个产品族中,添加一个新的产品等级,比如说 C ,那么,很显然,抽象工厂模式无能为力了。

(例子摘自java与模式一书),我对自己这种理解也不是很有把握,呵呵,希望版主能有更好的讲解。

crazyren
2002-11-29 10:04
而且最恼火的是,我分辨不出工厂和抽象工厂的差别,我总认为如果给工厂模式新添加一个产品族,就自然的成了抽象工厂。请板桥先生能给讲讲吗。

浮舟
2002-11-29 13:51
我记得看的阎宏发表在天极网上的文章上举的例子挺好的,他以一个后花园为例讲解的:

(工厂模式有简单工厂模式,工厂方法模式和抽象工厂模式几种形态。)

一开始只在后花园中种蔬菜类的时候可以用简单工厂模式,由工厂负责生成具体的蔬菜类,

但是如果后花园要引进水果类的时候简单模式就行不通了,因此需要使用工厂方法模式,将产品类族分开。

但是如果后花园的规模继续扩大到地域范围的分割时,比如说一个在北京,一个在上海的时候,工厂方法模式就不够了,因为对两个后花园来说,每个后花园的植物是要被种在一起的,并且两个后花园用工厂方法模式是无法体现其区别的。

我个人认为抽象工厂和工厂方法的最大区别应该是抽象工厂提取了各个工厂方法的共性,并且能够确保工厂方法中产生的产品类能够在一起工作。

而且我觉得向上面所说的加入一个产品c,这应该是去修改抽象产品类,而与工厂无关。

呵呵,不知道我的理解对不对,但我还是建议大家先去看看阎宏的文章,联接如下:

http://www.yesky.com/20011114/205122_2.shtml

浮舟
2002-11-29 13:53
为什么url不能显示成超连接啊,版本为什么不用微软提供的控件实现可视化编辑那?

猜你喜欢