一、介绍
抽象工厂模式相对工厂方法模式(Facotry Method)要复杂的多,一个抽象的工厂可以拥有多种方法,从而来生成不同性质的对象(产品)。
二、实例
这里举一个例子,例子的UML类图如下:
创建抽象工厂,首先要定义一个抽象工厂类,用来指明有哪些个制造方法,在本例子中,我们在抽象工厂类AbstractSoupFactory中定义了制造各种炖汤的方法:
abstract class AbstractSoupFactory {
String factoryLocation;
public String getFactoryLocation() {
return factoryLocation;
}
public ChickenSoup makeChickenSoup() {
return new ChickenSoup();
}
public ClamChowder makeClamChowder() {
return new ClamChowder();
}
public FishChowder makeFishChowder() {
return new FishChowder();
}
public Minnestrone makeMinnestrone() {
return new Minnestrone();
}
public PastaFazul makePastaFazul() {
return new PastaFazul();
}
public TofuSoup makeTofuSoup() {
return new TofuSoup();
}
public VegetableSoup makeVegetableSoup() {
return new VegetableSoup();
}
}
接下来,我们需要来一个实例化的工厂,比如说一家来自Boston的餐馆可以制作具有[波士顿]风格的炖汤,代码BostonConcreteSoupFactory内容如下:
class BostonConcreteSoupFactory extends AbstractSoupFactory {
public BostonConcreteSoupFactory() {
factoryLocation = "Boston";
}
public ClamChowder makeClamChowder() {
return new BostonClamChowder();
}
public FishChowder makeFishChowder() {
return new BostonFishChowder();
}
}
class BostonClamChowder extends ClamChowder {
public BostonClamChowder() {
soupName = "QuahogChowder";
soupIngredients.clear();
soupIngredients.add("1 Pound Fresh Quahogs");
soupIngredients.add("1 cup corn");
soupIngredients.add("1/2 cup heavy cream");
soupIngredients.add("1/4 cup butter");
soupIngredients.add("1/4 cup potato chips");
}
}
class BostonFishChowder extends FishChowder {
public BostonFishChowder() {
soupName = "ScrodFishChowder";
soupIngredients.clear();
soupIngredients.add("1 Pound Fresh Scrod");
soupIngredients.add("1 cup corn");
soupIngredients.add("1/2 cup heavy cream");
soupIngredients.add("1/4 cup butter");
soupIngredients.add("1/4 cup potato chips");
}
}
现在我们来写一个类,来分享这些汤料的美味吧!
import java.util.Calendar;
class TestAbstractSoupFactory {
public static Soup MakeSoupOfTheDay(AbstractSoupFactory
concreteSoupFactory)
{
Calendar todayCalendar = Calendar.getInstance();
//int dayOfWeek = todayCalendar.get(Calendar.DAY_OF_WEEK);
int dayOfWeek = Calendar.TUESDAY;
if (dayOfWeek == Calendar.MONDAY) {
return concreteSoupFactory.makeChickenSoup();
} else if (dayOfWeek == Calendar.TUESDAY) {
return concreteSoupFactory.makeClamChowder();
} else if (dayOfWeek == Calendar.WEDNESDAY) {
return concreteSoupFactory.makeFishChowder();
} else if (dayOfWeek == Calendar.THURSDAY) {
return concreteSoupFactory.makeMinnestrone();
} else if (dayOfWeek == Calendar.TUESDAY) {
return concreteSoupFactory.makePastaFazul();
} else if (dayOfWeek == Calendar.WEDNESDAY) {
return concreteSoupFactory.makeTofuSoup();
} else {
return concreteSoupFactory.makeVegetableSoup();
}
}
public static void main(String[] args)
{
AbstractSoupFactory concreteSoupFactory =
new BostonConcreteSoupFactory();
Soup soupOfTheDay =
MakeSoupOfTheDay(concreteSoupFactory);
System.out.println("The Soup of the day " +
concreteSoupFactory.getFactoryLocation() +
" is " +
soupOfTheDay.getSoupName());
concreteSoupFactory =
new HonoluluConcreteSoupFactory();
soupOfTheDay =
MakeSoupOfTheDay(concreteSoupFactory);
System.out.println("The Soup of the day " +
concreteSoupFactory.getFactoryLocation() +
" is " +
soupOfTheDay.getSoupName());
}
}
三、分析
通过以上抽象工厂模式的实例,我们可以总结出以下这些参与者:
- AbstractFactory 抽象工厂类,声明一个创建抽象产品(AbstractProduct)的操作接口。
- ConcreteFactory 具体工厂类,可以有一个或多个,实现创建具体产品对象的操作。
- AbstractProduct 抽象产品类,可以有一个或多个,为一类产品对象声明一个接口。
- ConcreteProduct 具体产品类,定义一个被相应的具体工厂创建的产品对象,它继承或实现了相应的抽象产品类。
- Client 客户端,仅用AbstractFactory和AbstractProduct类来声明调用接口,直到调用时才为接口传入的具体工厂或产品。
实现一个抽象工厂模式,需要以下几个关键步骤:
1、定义一个抽象的工厂类,里面定义许多同种类别但不同性质的产品的制造实现方法。简单的说,这个工厂就是一个加工中心,盛产多种不同型号的产品。值得注意的是,抽象工厂里面定义的都是抽象的产品。
2、定义相关的工厂实现类,这个类实现了第1步中的抽象工厂类,这个工厂在父抽象类的基础上,可以进一步生产出具有自己特色的产品。这些个特产是基于该父抽象类中产品扩展出来的,即继承并衍生父抽象类中定义的产品,加上了一些本地特色。
3、实际调用过程中,我们可以定义一个通用的Factory类,其类别名称即父抽象类。具体的产品取决于我们提供的实际工厂类是什么。
该模式的优点是可以不用知道产品具体的制造实现细节,客户只需要指定到哪个工厂就可以了,客户不会直接与产品打交道。
该模式的缺点是当产品修改时,工厂类也要做相应的修改,增加或修改一种产品,可能要涉及到所有相关工厂类的改动。
分享到:
相关推荐
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/1032977
博客 走进设计模式之抽象工厂(Abstract Factory) 对应代码
3、抽象工厂模式(Abstract Factory Pattern) 用意:一个工厂生产一系列产品
C#设计模式之抽象工厂(abstract factory)模式示例源代码
抽象工厂模式(Abstract Factory Pattern) 引入: 在前面介绍的两个创建型模式里面,我们解决的都是有关"new"的问题,用它们来避免显式指定类创建对象。我写的也非常简单易懂,相信看过的朋友们都应该对简单工厂...
设计模式抽象工厂模式(AbstractFactory)源代码
设计模式C++学习之抽象工厂模式(AbstractFactory)
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
java之 抽象工厂模式(abstract factory) 之水果类和蔬菜类 (香蕉、梨、黄瓜、大蒜),北方市场,南方市场。。
Abstract_Factory抽象工厂Abstract_Factory抽象工厂Abstract_Factory抽象工厂Abstract_Factory抽象工厂
设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)
在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),...这就是我们要说的抽象工厂模式。
生产餐具和相应食物的工厂,有两个车间,其中一个车间用以生产餐具,一个车间用以生产相应的食物。 每个具体工厂生产出来的具体产品根据不同工厂的不同各不相同,但是客户使用产品的方法是一致的。比如客户在得到...
NULL 博文链接:https://conkeyn.iteye.com/blog/1245113
NULL 博文链接:https://zhouhaitao.iteye.com/blog/1003684
设计模式,AbstractFactory,抽象工厂模式
抽象工厂模式可以实现不同数据库之间的无缝移植。 该项目是在三层架构的基础上改进的。希望对初学者有帮助。
Abstract Factory模式 1 定义创建对象的接口,并封装对象的创建 2 将具体化类的工作延迟到了类中 3 创建创建一组相关对象或者说是一组相互依赖的对象 一般情况下,我们为了提高内聚和松耦合,经常会使用多态来...
里面是整个抽象工厂的实现,具体可以参见我的博客 http://blog.csdn.net/renlei0109/article/details/25242983
6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER PATTERN 11、桥梁模式BRIDGE PATTERN 12、...