一. 工廠方法
定義了一個對象的接口,但由子類決定要實例化的類是哪一個.工廠方法讓類把實例化推遲到子類,
在簡單工廠中,原本是一個對象負責所有對象的實例化,現在將這個工廠提取到一個類中做一個實例化的方法.
二. 所有工廠模式都用來封裝對象的創建.工廠方法通過讓子類決定該創建的對象是什麽,來達到將對象創建的過程封裝的目的.
三.工廠方法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. 運行結果如下:
相关推荐
例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...
Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...
工厂方法模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪个类。这种模式将实例化延迟到子类,使得系统更加灵活,易于扩展。 **适用场景**: - 当一个类不确定需要创建的对象类型时...
工厂方法模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。这样,工厂方法将类的实例化推迟到子类。在Java中,我们可以定义一个工厂接口,然后由具体的子类实现这个接口,创建...
学习Java中的工厂方法模式,探索示例、用途、好处以及它如何增强代码的灵活性和可维护性。 **二、别名** * Virtual Constructor **三、Factory Method设计模式的意图** 使用工厂方法模式定义一个用于创建对象的...
### Java设计模式详解 #### 创建型模式 **1.1 工厂方法(Factory Method)** 工厂方法模式定义了一个创建对象的接口,但允许子类决定实例化哪一个类。这使得一个类的实例化可以被推迟到其子类。这种模式在以下...
创建型模式涉及对象的实例化过程,如单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。结构型模式关注如何将类或对象组合成更大的结构,比如适配器(Adapter)、装饰器(Decorator)...
JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...
JAVA设计模式是编程领域中非常重要的概念,它为软件开发人员提供了在特定情境下解决常见问题的模板。设计模式公司出品的《JAVA设计模式》书籍,详细介绍了多种设计模式,适合不同水平的程序员学习和使用。 首先,...
### Java设计模式详解 #### 1. 创建型模式 创建型模式主要关注的是对象的创建方式,它们提供了创建对象的最佳方法。以下是对几种常见的创建型模式的深入解析: ##### 1.1.1 工厂方法(Factory Method) **定义**...
3. 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。 4. 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而无需指定它们的具体类。 5. ...
2. **工厂方法模式**(Factory Method Pattern):相比简单工厂模式,工厂方法模式将对象的创建委托给子类,使得核心工厂类更加抽象,不涉及具体产品的创建。这提高了系统的扩展性。例如: ```java public abstract...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可扩展性。本压缩包包含的源代码涵盖了多个经典的设计模式,接下来将对这些模式进行详细介绍。 1....
工厂方法模式 (Factory Method) - **定义**:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 - **应用场景**:一个类不知道它所必须创建的对象的类的时候;一个...
创建型设计模式如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype),它们主要关注对象的创建过程,使得代码更加灵活且易于扩展。 结构型设计...
创建型模式关注对象的创建,如单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。这些模式帮助我们控制实例化过程,使代码更具灵活性和可扩展性。 结构型模式涉及到如何组合类和对象...
通过这个压缩包中的`factorymethodpattern`文件,你可以更深入地了解如何在实际的Java代码中实现和应用工厂方法模式,包括具体的类定义、方法调用和运行逻辑。通过阅读和学习这段代码,你可以掌握如何在自己的项目中...
工厂方法模式用于创建对象,允许推迟实例化到子类,增强了代码的灵活性。装饰器模式可以在不改变对象接口的情况下,动态地给对象添加新的行为或职责。而代理模式可以用来控制对原对象的访问,比如在访问前进行权限...