`

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设计模式-day2.pdf

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

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

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

    Java设计模式之工厂模式(Factory)

    2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory) 这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。下面是使用...

    在Java中应用设计模式-FactoryMethod

    在设计模式中,FactoryMethod也是比较简单的一个,但应用非常广泛,EJB,RMI,COM,CORBA,Swing中都可以看到此模式的影子,它是最重要的模式之一.在很多地方我们都会看到xxxFactory这样命名的类,那么,什么是FactoryMethod,...

    java版本二十三种设计模式.zip

    - 工厂方法模式(Factory Method) - 抽象工厂模式(Abstract Factory) - 单例模式(Singleton) - 建造者模式(Builder) - 原型模式(Prototype) - 代理模式(Proxy) - 适配器模式(Adapter) - 装饰器模式(Decorator...

    java 简单工厂模式 源代码

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂...

    各个设计模式的介绍Factory ,Builder

    各个设计模式的介绍,非常不错 Java与设计模式 设计模式之Factory -工厂模式设计模式之FACTORY METHOD -工厂模式設計模式之Builder -建造模式

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第16章 工厂方法(factory method)模式 141 第17章 抽象工厂(abstract factory)模式 148 第18章 原型(prototype)模式 158 第19章 备忘录(memento)模式 163 第20章 操作型模式介绍 176 第21章 模板方法(template ...

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    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工厂模式

    GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。 两者皆可,在...

    java设计模式教程+源代码

    FactoryMethod ( 工厂方法 ) Singleton ( 单态模式 ) Builder ( 建造者模式 ) Prototype ( 原型模式 ) Adapter ( 适配器模式 ) Bridge ( 桥接模式 ) Composite ( 组合模式 ) Decorator ( 装饰模式 ) Facade ...

    java设计模式期末考试选择题100道

    适合Java设计模式期末考试选择题复习,形式如下: 10.(单选题)Facade(外观)模式的意图是 正确答案: A A.希望简化现有系统的使用方法...工厂方法模式(Factory Method) C.适配器模式(Adapter) D.单例模式(Singleton)

    design-pattern-java.pdf

    Factory Method Pattern 工厂三兄弟之工厂方法模式(一) 工厂三兄弟之工厂方法模式(二) 工厂三兄弟之工厂方法模式(三) 工厂三兄弟之工厂方法模式(四) 抽象工厂模式-Abstract Factory Pattern 工厂三兄弟之...

    设计模式_创建类_5种模式Java的实际例子_注释详细

    设计模式_创建类_5种模式Java的实际例子_注释详细 包括 1、单例模式(Singleton) 2、工厂方法(Factory Method) 3、抽象工厂(Abstract Factory) 4、建造模式(Builder) 5、原型模式(Prototype)

    Java面试 java设计模式整理 单例、工厂、策略等 面试使用,学习使用

    java的设计模式大体上分为三大类: 2 设计模式遵循的原则有6个: 2 1. 工厂模式(Factory Method) 2 2. 抽象工厂模式(Abstract Factory) 3 3. 单例模式(Singleton) 4 4.建造者模式(Builder) 4 5. 原型模式...

    java设计模式

    java设计模式设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract Factory,抽象工厂:提供一个...

    研磨设计模式-part2

    第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 ...

    研磨设计模式-part4

    第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 ...

    研磨设计模式-part3

    第6章 工厂方法模式(Factory Method) 第7章 抽象工厂模式(Abstract Factory) 第8章 生成器模式(Builder) 第9章 原型模式(Prototype) 第10章 中介者模式(Mediator) 第11章 代理模式(Proxy) 第12章 ...

Global site tag (gtag.js) - Google Analytics