一. 工廠方法
定義了一個對象的接口,但由子類決定要實例化的類是哪一個.工廠方法讓類把實例化推遲到子類,
在簡單工廠中,原本是一個對象負責所有對象的實例化,現在將這個工廠提取到一個類中做一個實例化的方法.
二. 所有工廠模式都用來封裝對象的創建.工廠方法通過讓子類決定該創建的對象是什麽,來達到將對象創建的過程封裝的目的.
三.工廠方法UML類圖如下:
四. 接著"簡單工廠"中的事例,在為這個酒店開三家分店.示例代碼如下:
1. 菜肴的制作流程
package creationalPattern.factory.method; /** * 菜肴的制作流程 * @author Liyongbin * @date 2011-02-06 */ public abstract class Cuisine { //帶有缺省的實現 public String purchase(){ return "原 料採購"; } public String processing(){ return "烹調加工"; } public String vendition(){ return "成品銷售"; } }
2. 粵菜類
package creationalPattern.factory.method; /** * 粵菜類 * @author Liyongbin * @date 2011-02-06 */ public class ContoneseCuisine extends Cuisine{ @Override public String processing() { return "粵菜烹調加工"; } @Override public String purchase() { return "粵菜原料採購"; } @Override public String vendition() { return "粵菜成品銷售"; } }
川菜類
package creationalPattern.factory.method; /** * 川菜類 * @author Liyongbin * @date 2011-02-06 */ public class SichuanCuisine extends Cuisine{ @Override public String processing() { return "川菜烹調加工"; } @Override public String purchase() { return "川菜原料採購"; } @Override public String vendition() { return "川菜成品銷售"; } }
湘菜類
package creationalPattern.factory.method; /** * 湘菜類 * @author Liyongbin * @date 2011-02-06 */ public class HunanCuisine extends Cuisine{ @Override public String processing() { return "湘菜烹調加工"; } @Override public String purchase() { return "湘菜原料採購"; } @Override public String vendition() { return "湘菜成品銷售"; } }
3.抽象類中工廠方法
package creationalPattern.factory.method;
/**
* 香格裡拉酒店[總店]
* @author Liyongbin
*
*/
public abstract class ShangriLaHotel {
/**
* 制作菜肴的方法[工廠方法]
* @param localCuisine生產的地方菜
* @return
*/
public abstract Cuisine cooking(String localCuisine);
/**
* 訂單方法
* @param localCuisine預訂的地方菜
*/
public void order(String localCuisine){
Cuisine cuisine;
//調用[工廠方法]
cuisine = cooking(localCuisine);
//生成出具有地方風味的菜肴
System.out.println(cuisine.purchase());
System.out.println(cuisine.processing());
System.out.println(cuisine.vendition());
}
}
4.廣州分店:
package creationalPattern.factory.method; /** * 香格裡拉酒店[廣州分店] * @author Liyongbin * @date 2011-02-06 */ public class ShangriLaHotel4Guangzhou extends ShangriLaHotel{ /** * 制作有本地[廣州]特色的地方[川,湘,粵]名菜 * @param localCuisine預訂的地方名菜 */ @Override public Cuisine cooking(String localCuisine) { System.out.println("香格裡拉大酒店[廣州分店]"); Cuisine cuisine=null; if (localCuisine.equalsIgnoreCase("Hunan")) {//湘菜 cuisine=new HunanCuisine(); } else if(localCuisine.equalsIgnoreCase("Sichuan")){//川菜 cuisine=new SichuanCuisine(); } else if(localCuisine.equalsIgnoreCase("Guangdong")){//粵菜 cuisine=new ContoneseCuisine(); } return cuisine; } }
上海分店:
package creationalPattern.factory.method; /** * 香格裡拉酒店[上海分店] * @author Liyongbin * @date 2011-02-06 */ public class ShangriLaHotel4ShangHai extends ShangriLaHotel{ /** * 制作有本地[上海]特色的地方[川,湘,粵]名菜 * @param localCuisine預訂的地方名菜 */ @Override public Cuisine cooking(String localCuisine) { System.out.println("香格裡拉大酒店[上海分店]"); Cuisine cuisine=null; if (localCuisine.equalsIgnoreCase("Hunan")) {//湘菜 cuisine=new HunanCuisine(); } else if(localCuisine.equalsIgnoreCase("Sichuan")){//川菜 cuisine=new SichuanCuisine(); } else if(localCuisine.equalsIgnoreCase("Guangdong")){//粵菜 cuisine=new ContoneseCuisine(); } return cuisine; } }
北京分店:
package creationalPattern.factory.method; /** * 香格裡拉酒店[北京分店] * @author Liyongbin * @date 2011-02-06 */ public class ShangriLaHotel4BeiJing extends ShangriLaHotel{ /** * 制作有本地[北京]特色的地方[川,湘,粵]名菜 * @param localCuisine預訂的地方名菜 */ @Override public Cuisine cooking(String localCuisine) { System.out.println("香格裡拉大酒店[北京分店]"); Cuisine cuisine=null; if (localCuisine.equalsIgnoreCase("Hunan")) {//湘菜 cuisine=new HunanCuisine(); } else if(localCuisine.equalsIgnoreCase("Sichuan")){//川菜 cuisine=new SichuanCuisine(); } else if(localCuisine.equalsIgnoreCase("Guangdong")){//粵菜 cuisine=new ContoneseCuisine(); }else if(localCuisine.equalsIgnoreCase("Shandong")){//魯菜 cuisine=new BeiJing4Cuisine(); } return cuisine; } }
5. 分店可以有自己的制作流程
package creationalPattern.factory.method; public class BeiJing4Cuisine extends Cuisine { //覆蓋總店的菜肴制作過程 @Override public String purchase() { return "魯菜原料採購"; } //覆蓋總店的菜肴制作過程 @Override public String processing() { return "魯菜烹調加工"; } //覆蓋總店的菜肴制作過程 @Override public String vendition() { return "魯菜成品銷售"; } }
6. 網上訂購[工廠方法的測試]
package creationalPattern.factory.method; /** * 網上訂餐測試 * @author Liyongbin * @date 2011-02-06 */ public class FactoryMethodTest { public static void main(String[] args) { //預訂香格裡拉[北京]的川菜 ShangriLaHotel4BeiJing slh4bj = new ShangriLaHotel4BeiJing(); slh4bj.order("Sichuan");//除了有總店規定的幾種菜系, slh4bj.order("Shandong");//還有自己獨特的菜系 System.out.println("---------------------"); //預訂香格裡拉[上海]的粵菜 ShangriLaHotel4ShangHai slh4sh = new ShangriLaHotel4ShangHai(); slh4sh.order("Guangdong"); System.out.println("---------------------"); //預訂香格裡拉[廣州]的湘菜 ShangriLaHotel4Guangzhou slh4gz = new ShangriLaHotel4Guangzhou(); slh4gz.order("hunan"); } }
7. 運行結果如下:
相关推荐
JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...
Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)
2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory) 这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。下面是使用...
在设计模式中,FactoryMethod也是比较简单的一个,但应用非常广泛,EJB,RMI,COM,CORBA,Swing中都可以看到此模式的影子,它是最重要的模式之一.在很多地方我们都会看到xxxFactory这样命名的类,那么,什么是FactoryMethod,...
- 工厂方法模式(Factory Method) - 抽象工厂模式(Abstract Factory) - 单例模式(Singleton) - 建造者模式(Builder) - 原型模式(Prototype) - 代理模式(Proxy) - 适配器模式(Adapter) - 装饰器模式(Decorator...
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂...
各个设计模式的介绍,非常不错 Java与设计模式 设计模式之Factory -工厂模式设计模式之FACTORY METHOD -工厂模式設計模式之Builder -建造模式
第16章 工厂方法(factory method)模式 141 第17章 抽象工厂(abstract factory)模式 148 第18章 原型(prototype)模式 158 第19章 备忘录(memento)模式 163 第20章 操作型模式介绍 176 第21章 模板方法(template ...
pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/abstractfactory //11.2抽象工厂模式 pattern/src/creation/singleton //11.3单例模式 pattern/src/creation/builder //11.4建造者...
适合Java设计模式期末考试选择题复习,形式如下: 10.(单选题)Facade(外观)模式的意图是 正确答案: A A.希望简化现有系统的使用方法...工厂方法模式(Factory Method) C.适配器模式(Adapter) D.单例模式(Singleton)
GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。 两者皆可,在...
FactoryMethod ( 工厂方法 ) Singleton ( 单态模式 ) Builder ( 建造者模式 ) Prototype ( 原型模式 ) Adapter ( 适配器模式 ) Bridge ( 桥接模式 ) Composite ( 组合模式 ) Decorator ( 装饰模式 ) Facade ...
Factory Method Pattern 工厂三兄弟之工厂方法模式(一) 工厂三兄弟之工厂方法模式(二) 工厂三兄弟之工厂方法模式(三) 工厂三兄弟之工厂方法模式(四) 抽象工厂模式-Abstract Factory Pattern 工厂三兄弟之...
设计模式_创建类_5种模式Java的实际例子_注释详细 包括 1、单例模式(Singleton) 2、工厂方法(Factory Method) 3、抽象工厂(Abstract Factory) 4、建造模式(Builder) 5、原型模式(Prototype)
java的设计模式大体上分为三大类: 2 设计模式遵循的原则有6个: 2 1. 工厂模式(Factory Method) 2 2. 抽象工厂模式(Abstract Factory) 3 3. 单例模式(Singleton) 4 4.建造者模式(Builder) 4 5. 原型模式...
java设计模式设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个...
- **工厂方法模式(Factory Method Pattern)**:定义一个创建对象的接口,让子类决定实例化哪一个类。 - **示例**:日志记录器 - **抽象工厂模式(Abstract Factory Pattern)**:提供一个创建一系列相关或相互...
第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 ...
第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 ...