- 浏览: 136443 次
- 性别:
- 来自: 珠海
文章分类
最新评论
-
jjr_1983:
# function populateDiv(type, da ...
使用Dojo和JSON构建Ajax应用 -
tailsherry:
这里只是一个例子,大家不要纠结这个getHtmlStream如 ...
如何让Struts2.0下载文件流 -
gotosuzhou:
楼主:请教下:reportStream = service.g ...
如何让Struts2.0下载文件流 -
sunshineparasol:
getHtmlStreamleon1509 写道博主,贴一下s ...
如何让Struts2.0下载文件流 -
floys1987:
谢谢,谢谢,太感谢了
利用Javascript向页面中插入TABLE,IE下无法正常显示
一、介绍
工厂方法模式是通过工厂方法,用不同方式来创建并返回一个对象。
二、实例
实例的UML图如下:
在本模式的例子中,SoupFactoryMethod定义了一个makeSoupBuffet方法,用来返回一个SoupBuffet对象。在SoupFactoryMethod中同样也定义了用来创建SoupBuffet的其它子方法。
class SoupFactoryMethod { public SoupFactoryMethod() {} public SoupBuffet makeSoupBuffet() { return new SoupBuffet(); } 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(); } public String makeBuffetName() { return "Soup Buffet"; } }
BostonSoupFactoryMethodSubclass继承了SoupFactoryMethod,子类覆写了父类中的makeFishChowder方法,返回一个拥有FishChowder子类BostonFishChowder实例的SoupBffet对象。
class BostonSoupFactoryMethodSubclass extends SoupFactoryMethod { public String makeBuffetName() { return "Boston Soup Buffet"; } 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"); } }
同样,我们也定义了HonoluluSoupFactoryMethodSubclass:
class HonoluluSoupFactoryMethodSubclass extends SoupFactoryMethod { public String makeBuffetName() { return "Honolulu Soup Buffet"; } public ClamChowder makeClamChowder() { return new HonoluluClamChowder(); } public FishChowder makeFishChowder() { return new HonoluluFishChowder(); } } class HonoluluClamChowder extends ClamChowder { public HonoluluClamChowder() { soupName = "PacificClamChowder"; soupIngredients.clear(); soupIngredients.add("1 Pound Fresh Pacific Clams"); soupIngredients.add("1 cup pineapple chunks"); soupIngredients.add("1/2 cup coconut milk"); soupIngredients.add("1/4 cup SPAM"); soupIngredients.add("1/4 cup taro chips"); } } class HonoluluFishChowder extends FishChowder { public HonoluluFishChowder() { soupName = "OpakapakaFishChowder"; soupIngredients.clear(); soupIngredients.add("1 Pound Fresh Opakapaka Fish"); soupIngredients.add("1 cup pineapple chunks"); soupIngredients.add("1/2 cup coconut milk"); soupIngredients.add("1/4 cup SPAM"); soupIngredients.add("1/4 cup taro chips"); } }
前面两个模式中,我们都没有写下定义Soup父子类的创建代码,这里顺便提及以下:
import java.util.ArrayList; import java.util.ListIterator; abstract class Soup { ArrayList soupIngredients = new ArrayList(); String soupName; public String getSoupName() { return soupName; } public String toString() { StringBuffer stringOfIngredients = new StringBuffer(soupName); stringOfIngredients.append(" Ingredients: "); ListIterator soupIterator = soupIngredients.listIterator(); while (soupIterator.hasNext()) { stringOfIngredients.append((String)soupIterator.next()); } return stringOfIngredients.toString(); } } class ChickenSoup extends Soup { public ChickenSoup() { soupName = "ChickenSoup"; soupIngredients.add("1 Pound diced chicken"); soupIngredients.add("1/2 cup rice"); soupIngredients.add("1 cup bullion"); soupIngredients.add("1/16 cup butter"); soupIngredients.add("1/4 cup diced carrots"); } } class ClamChowder extends Soup { public ClamChowder() { soupName = "ClamChowder"; soupIngredients.add("1 Pound Fresh Clams"); soupIngredients.add("1 cup fruit or vegetables"); soupIngredients.add("1/2 cup milk"); soupIngredients.add("1/4 cup butter"); soupIngredients.add("1/4 cup chips"); } } class FishChowder extends Soup { public FishChowder() { soupName = "FishChowder"; soupIngredients.add("1 Pound Fresh fish"); soupIngredients.add("1 cup fruit or vegetables"); soupIngredients.add("1/2 cup milk"); soupIngredients.add("1/4 cup butter"); soupIngredients.add("1/4 cup chips"); } } class Minnestrone extends Soup { public Minnestrone() { soupName = "Minestrone"; soupIngredients.add("1 Pound tomatos"); soupIngredients.add("1/2 cup pasta"); soupIngredients.add("1 cup tomato juice"); } } class PastaFazul extends Soup { public PastaFazul() { soupName = "Pasta Fazul"; soupIngredients.add("1 Pound tomatos"); soupIngredients.add("1/2 cup pasta"); soupIngredients.add("1/2 cup diced carrots"); soupIngredients.add("1 cup tomato juice"); } } class TofuSoup extends Soup { public TofuSoup() { soupName = "Tofu Soup"; soupIngredients.add("1 Pound tofu"); soupIngredients.add("1 cup carrot juice"); soupIngredients.add("1/4 cup spirolena"); } } class VegetableSoup extends Soup { public VegetableSoup() { soupName = "Vegetable Soup"; soupIngredients.add("1 cup bullion"); soupIngredients.add("1/4 cup carrots"); soupIngredients.add("1/4 cup potatoes"); } }
当然,这里也定义了集合对象SoupBuffet:
class SoupBuffet { String soupBuffetName; ChickenSoup chickenSoup; ClamChowder clamChowder; FishChowder fishChowder; Minnestrone minnestrone; PastaFazul pastaFazul; TofuSoup tofuSoup; VegetableSoup vegetableSoup; public String getSoupBuffetName() { return soupBuffetName; } public void setSoupBuffetName(String soupBuffetNameIn) { soupBuffetName = soupBuffetNameIn; } public void setChickenSoup(ChickenSoup chickenSoupIn) { chickenSoup = chickenSoupIn; } public void setClamChowder(ClamChowder clamChowderIn) { clamChowder = clamChowderIn; } public void setFishChowder(FishChowder fishChowderIn) { fishChowder = fishChowderIn; } public void setMinnestrone(Minnestrone minnestroneIn) { minnestrone = minnestroneIn; } public void setPastaFazul(PastaFazul pastaFazulIn) { pastaFazul = pastaFazulIn; } public void setTofuSoup(TofuSoup tofuSoupIn) { tofuSoup = tofuSoupIn; } public void setVegetableSoup(VegetableSoup vegetableSoupIn) { vegetableSoup = vegetableSoupIn; } public String getTodaysSoups() { StringBuffer stringOfSoups = new StringBuffer(); stringOfSoups.append(" Today's Soups! "); stringOfSoups.append(" Chicken Soup: "); stringOfSoups.append(this.chickenSoup.getSoupName()); stringOfSoups.append(" Clam Chowder: "); stringOfSoups.append(this.clamChowder.getSoupName()); stringOfSoups.append(" Fish Chowder: "); stringOfSoups.append(this.fishChowder.getSoupName()); stringOfSoups.append(" Minnestrone: "); stringOfSoups.append(this.minnestrone.getSoupName()); stringOfSoups.append(" Pasta Fazul: "); stringOfSoups.append(this.pastaFazul.getSoupName()); stringOfSoups.append(" Tofu Soup: "); stringOfSoups.append(this.tofuSoup.getSoupName()); stringOfSoups.append(" Vegetable Soup: "); stringOfSoups.append(this.vegetableSoup.getSoupName()); return stringOfSoups.toString(); } }
实际过程中,我们实践工厂方法模式代码如下:
class TestSoupFactoryMethod { public static void main(String[] args) { SoupFactoryMethod soupFactoryMethod = new SoupFactoryMethod(); SoupBuffet soupBuffet = soupFactoryMethod.makeSoupBuffet(); soupBuffet.setSoupBuffetName( soupFactoryMethod.makeBuffetName()); soupBuffet.setChickenSoup( soupFactoryMethod.makeChickenSoup()); soupBuffet.setClamChowder( soupFactoryMethod.makeClamChowder()); soupBuffet.setFishChowder( soupFactoryMethod.makeFishChowder()); soupBuffet.setMinnestrone( soupFactoryMethod.makeMinnestrone()); soupBuffet.setPastaFazul( soupFactoryMethod.makePastaFazul()); soupBuffet.setTofuSoup( soupFactoryMethod.makeTofuSoup()); soupBuffet.setVegetableSoup( soupFactoryMethod.makeVegetableSoup()); System.out.println("At the " + soupBuffet.getSoupBuffetName() + soupBuffet.getTodaysSoups()); SoupFactoryMethod bostonSoupFactoryMethod = new BostonSoupFactoryMethodSubclass(); SoupBuffet bostonSoupBuffet = bostonSoupFactoryMethod.makeSoupBuffet(); bostonSoupBuffet.setSoupBuffetName( bostonSoupFactoryMethod.makeBuffetName()); bostonSoupBuffet.setChickenSoup( bostonSoupFactoryMethod.makeChickenSoup()); bostonSoupBuffet.setClamChowder( bostonSoupFactoryMethod.makeClamChowder()); bostonSoupBuffet.setFishChowder( bostonSoupFactoryMethod.makeFishChowder()); bostonSoupBuffet.setMinnestrone( bostonSoupFactoryMethod.makeMinnestrone()); bostonSoupBuffet.setPastaFazul( bostonSoupFactoryMethod.makePastaFazul()); bostonSoupBuffet.setTofuSoup( bostonSoupFactoryMethod.makeTofuSoup()); bostonSoupBuffet.setVegetableSoup( bostonSoupFactoryMethod.makeVegetableSoup()); System.out.println("At the " + bostonSoupBuffet.getSoupBuffetName() + bostonSoupBuffet.getTodaysSoups()); SoupFactoryMethod honoluluSoupFactoryMethod = new HonoluluSoupFactoryMethodSubclass(); SoupBuffet honoluluSoupBuffet = honoluluSoupFactoryMethod.makeSoupBuffet(); honoluluSoupBuffet.setSoupBuffetName( honoluluSoupFactoryMethod.makeBuffetName()); honoluluSoupBuffet.setChickenSoup( honoluluSoupFactoryMethod.makeChickenSoup()); honoluluSoupBuffet.setClamChowder( honoluluSoupFactoryMethod.makeClamChowder()); honoluluSoupBuffet.setFishChowder( honoluluSoupFactoryMethod.makeFishChowder()); honoluluSoupBuffet.setMinnestrone( honoluluSoupFactoryMethod.makeMinnestrone()); honoluluSoupBuffet.setPastaFazul( honoluluSoupFactoryMethod.makePastaFazul()); honoluluSoupBuffet.setTofuSoup( honoluluSoupFactoryMethod.makeTofuSoup()); honoluluSoupBuffet.setVegetableSoup( honoluluSoupFactoryMethod.makeVegetableSoup()); System.out.println("At the " + honoluluSoupBuffet.getSoupBuffetName() + honoluluSoupBuffet.getTodaysSoups()); } }
三、分析
从例子中,我们可以针对工厂方法模式,统计出的以下这些角色:
- Prodcut 定义工厂方法所创建的对象的接口,如我们例子中Soup类。 ConcreteProduct 实际产品,扩展了Soup接口类。如这里的FishChowder,BostonFishChowder等等。
- Creator 工厂方法,该方法返回一个Product对象。如这SoupFactoryMethod里的makeFishChowder方法。
- ConcreteCreator 重定义一个方法,并返回一个ConcreteProduct对象。如BostonSoupFactoryMethodSubclass中的makeFishChowder方法。
实现一个工厂方法模式,需要以下几个关键步骤:
1、定义基础产品类和相关的扩展产品类。
2、定义一个基础的工厂方法类,其中定义make产品的方法。
3、扩展基础工厂方法类,覆写已有的make方法,输出的产品含有扩展产品的信息。
以上的例子,我自己理解的时候,也感觉有点含糊。到底抽象工厂模式和工厂方法模式有什么差别?这里我自己总结了一下,欢迎指正。
区别于抽象工厂模式(Abstract Factory),工厂方法模式只用来make一种产品SoupBuffet,工厂接口本身不关心其子类Soup如何定义产生。确切的说,工厂方法模式的最终目的就是制造某种具体的产品,但返回的结果根据实际加工工艺的不同,会生成不同风格的成品。
换一种说法,抽象工厂模式可以生成多种产品,而工厂方法模式却只用来生成一种产品。如果把抽象工厂模式中的多种产品削减到一个品种,那么也就成了我们这里的工厂方法模式的一个简单模型。
可能在其它的设计模式的书本中,会接触到“简单工厂模式”,这种模式就更简单了。直接一个ConcreteCreator类就可以了,根据传入的参数不同,直接make返回该品种的实际产品。
发表评论
-
组合模式(Composite)
2008-03-31 14:48 1248一、介绍组合模式主要用于具有父子关系,或局部-整体关系的情况下 ... -
桥接模式(Bridge)
2007-12-18 11:30 1415一、介绍 桥接模式的主要目的是要将类的抽象部分与它的实现分离, ... -
适配器模式(Adapter)
2007-09-27 11:12 2301一、介绍 适配器模式使得一个接口与其它接口兼容,从而给出多 ... -
单例模式(Singleton)
2007-09-17 11:29 1884一、介绍 单例模式是一种比较普遍和简单的模式,在我们的程序中经 ... -
原型模式(Prototype)
2007-09-07 10:29 4056一、介绍 原型模式是在已指定对象的基础上,然后通过拷贝这些原型 ... -
建造模式(Builder)
2007-08-20 13:03 3520一、介绍建造模式(Builder)主要是为了将一个复杂的对象的 ... -
抽象工厂模式(Abstract Factory)
2007-08-15 13:15 2133一、介绍 抽象工厂模 ... -
学习设计模式(Design Patterns)
2007-08-15 10:30 1537设计模式(Design Patterns) ...
相关推荐
工厂方法模式是面向对象设计模式中的行为型模式之一,它提供了一种...在提供的文件列表中,“FactoryMethod”可能是包含这个简单示例代码的文件。如果有机会查看这个文件,将能更深入地理解工厂方法模式的实现细节。
《设计模式之——工厂方法(Factory Method)》 在软件工程中,设计模式是一种解决常见问题的可重用解决方案,它被广泛应用于构建高质量、可维护的代码。工厂方法是面向对象设计模式的一种,属于创建型模式。这个...
C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method)
工厂方法模式与简单工厂模式相比,具有更好的可扩展性。在简单工厂模式中,工厂类通常是静态的,负责创建所有类型的对象,这导致在添加新产品时,需要修改工厂类。而在工厂方法模式中,每种产品都有专门的工厂类负责...
- **简单工厂模式**:工厂方法模式比简单工厂模式更具有扩展性和灵活性,简单工厂模式只有一个静态工厂方法,而工厂方法模式则允许有更多的具体工厂。 - **抽象工厂模式**:工厂方法模式关注单个产品族,而抽象工厂...
设计模式C++学习之工厂方法模式(Factory Method)
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪一个具体类。这样,客户端代码就不需要知道具体的类是什么,只需通过工厂接口获取对象。 工厂...
在软件设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)是两种非常重要的创建型模式。它们主要用于解决对象实例化的问题,提供了一种封装对象创建过程的方法,使得代码更加灵活,易于扩展和...
工厂方法(Factory Method)是面向对象设计模式中的一个基础且广泛应用的模式,它属于创建型模式,主要目的是为了解耦对象的创建过程。本文将深入探讨工厂方法的设计理念、实现方式及其在实际开发中的应用。 ### ...
### Factory Method 工厂方法模式(创建型模式) #### 概述 在软件工程领域,设计模式是一种在特定上下文中解决常见问题的通用方案。Factory Method(工厂方法)模式是GoF(Gang of Four)设计模式之一,属于创建型...
5、工厂方法模式FACTORY METHOD PATTERN 6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER ...
Factory Method 工厂方法模式(创建型模式).wmv
Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。
它们都是由不同的厂家生产的,这就是工厂方法模式(FactoryMethod)与前面所说的简单工厂模式(SimpleFactory)的差别。 实例: 多文档系统。我已经用C#的源码编程了:请下载Factory Method Patter.rar
C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式) (Level 300)
在给定的"FactoryMethod"文件中,我们可以预期包含以下内容: - 一个抽象工厂类,如`ProductFactory`,其中定义了一个或多个创建产品的方法,这些方法通常是抽象的或声明为返回类型为抽象产品的接口。 - 至少两个...
至于标签中的“FactoryMethod 将#”,可能是因为标签被不完整地输入了。通常,“#”用于标记话题或者关键词,这里可能是想表达“工厂方法模式”的话题。在Java中,工厂方法模式通常用于实现“开闭原则”,即软件实体...