`

java设计模式--[创建模式]--工厂方法[factory method]

阅读更多

一. 工廠方法

           定義了一個對象的接口,但由子類決定要實例化的類是哪一個.工廠方法讓類把實例化推遲到子類,
    在簡單工廠中,原本是一個對象負責所有對象的實例化,現在將這個工廠提取到一個類中做一個實例化的方法.


二. 所有工廠模式都用來封裝對象的創建.工廠方法通過讓子類決定該創建的對象是什麽,來達到將對象創建的過程封裝的目的.

 

三.工廠方法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. 運行結果如下:
   
 
 

  • 大小: 9.9 KB
  • 大小: 5.6 KB
分享到:
评论

相关推荐

    java设计模式---诙谐易懂版

    例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

    Java设计模式-图解-附代码

    工厂方法模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪个类。这种模式将实例化延迟到子类,使得系统更加灵活,易于扩展。 **适用场景**: - 当一个类不确定需要创建的对象类型时...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    工厂方法模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。这样,工厂方法将类的实例化推迟到子类。在Java中,我们可以定义一个工厂接口,然后由具体的子类实现这个接口,创建...

    【Java设计模式-源码】Factory Method Pattern in Java: 使用多态制造增强灵活性

    学习Java中的工厂方法模式,探索示例、用途、好处以及它如何增强代码的灵活性和可维护性。 **二、别名** * Virtual Constructor **三、Factory Method设计模式的意图** 使用工厂方法模式定义一个用于创建对象的...

    java设计模式-图解-附代码

    ### Java设计模式详解 #### 创建型模式 **1.1 工厂方法(Factory Method)** 工厂方法模式定义了一个创建对象的接口,但允许子类决定实例化哪一个类。这使得一个类的实例化可以被推迟到其子类。这种模式在以下...

    JAVA设计模式---100%推荐

    创建型模式涉及对象的实例化过程,如单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。结构型模式关注如何将类或对象组合成更大的结构,比如适配器(Adapter)、装饰器(Decorator)...

    JAVA设计模式-day2.pdf

    JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...

    JAVA设计模式-设计模式公司出品

    JAVA设计模式是编程领域中非常重要的概念,它为软件开发人员提供了在特定情境下解决常见问题的模板。设计模式公司出品的《JAVA设计模式》书籍,详细介绍了多种设计模式,适合不同水平的程序员学习和使用。 首先,...

    Java设计模式-图文详解

    ### Java设计模式详解 #### 1. 创建型模式 创建型模式主要关注的是对象的创建方式,它们提供了创建对象的最佳方法。以下是对几种常见的创建型模式的深入解析: ##### 1.1.1 工厂方法(Factory Method) **定义**...

    JAVA设计模式--入门

    3. 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。 4. 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而无需指定它们的具体类。 5. ...

    java与设计模式--通俗易懂的介绍

    2. **工厂方法模式**(Factory Method Pattern):相比简单工厂模式,工厂方法模式将对象的创建委托给子类,使得核心工厂类更加抽象,不涉及具体产品的创建。这提高了系统的扩展性。例如: ```java public abstract...

    java设计模式----源代码

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可扩展性。本压缩包包含的源代码涵盖了多个经典的设计模式,接下来将对这些模式进行详细介绍。 1....

    java 设计模式-个人总结

    工厂方法模式 (Factory Method) - **定义**:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 - **应用场景**:一个类不知道它所必须创建的对象的类的时候;一个...

    《Java设计模式》课后答案-刘伟.rar

    创建型设计模式如单例(Singleton)、工厂方法(Factory Method)、抽象工厂(Abstract Factory)、建造者(Builder)和原型(Prototype),它们主要关注对象的创建过程,使得代码更加灵活且易于扩展。 结构型设计...

    JAVA design pattern-java设计模式

    创建型模式关注对象的创建,如单例(Singleton)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。这些模式帮助我们控制实例化过程,使代码更具灵活性和可扩展性。 结构型模式涉及到如何组合类和对象...

    设计模式-工厂方法代码

    通过这个压缩包中的`factorymethodpattern`文件,你可以更深入地了解如何在实际的Java代码中实现和应用工厂方法模式,包括具体的类定义、方法调用和运行逻辑。通过阅读和学习这段代码,你可以掌握如何在自己的项目中...

    设计模式-Java语言中的应用(pdf)

    工厂方法模式用于创建对象,允许推迟实例化到子类,增强了代码的灵活性。装饰器模式可以在不改变对象接口的情况下,动态地给对象添加新的行为或职责。而代理模式可以用来控制对原对象的访问,比如在访问前进行权限...

Global site tag (gtag.js) - Google Analytics