意圖:定義一個用於創建對象的接口,讓子類決定創建那個類。Factory Method使一個類的實例化延遲到其子類中
動機:框架使用抽象類定義和維護對象之間的關系。這些對象的創建通常也由框架負責
適用性:
1.當一個類不知道它所必須創建的對象的類的時候
2.當一個類希望由它的子類來指定它所創建的對象的時候
3.當類將創建對象的職責委托給多個幫助子類中的某一個,並且你希望將那一個幫助子類是代理者這一信息局部化的時候
結構:
工廠方法的實現主要有兩種情況:
1.Creator類是一個抽象類並且不提供它所聲明的工廠方法的實現
2.Creator是一個具體的類而且為工廠方法提供一個缺省的實現
實例:
1 package com.test.patten.factory; 2 3 public abstract class Creator { 4 public abstract Product productFactory(String type); 5 6 public void doSomething(String type) { 7 Product product = productFactory(type); 8 product.getPrice(); 9 } 10 }
1 package com.test.patten.factory; 2 3 public abstract class Product { 4 double price = 0; 5 public void getPrice() { 6 System.out.println("我的價格是:"+price); 7 } 8 }
1 package com.test.patten.factory; 2 3 public class GoodProduct extends Product { 4 5 public GoodProduct() { 6 super(); 7 this.price = 100.0; 8 } 9 }
1 package com.test.patten.factory; 2 3 public class BadProduct extends Product { 4 5 public BadProduct() { 6 super(); 7 this.price = 0.01; 8 } 9 }
1 package com.test.patten.factory; 2 3 public class ConcreteCreator extends Creator { 4 5 @Override 6 public Product productFactory(String type) { 7 Product product = null; 8 if(type.equals("good")){ 9 product = new GoodProduct(); 10 }else if (type.equals("bad")) { 11 product = new BadProduct(); 12 } 13 return product; 14 } 15 16 }
測試一下:
1 package com.test.patten.factory; 2 3 public class Client { 4 public static void main(String args[]){ 5 Creator creator = new ConcreteCreator(); 6 creator.doSomething("good");//生產一個好的產品 7 creator.doSomething("bad");//生產一個次品 8 } 9 }
我的價格是:100.0
我的價格是:0.01
應用:工廠方法主要應用於工具包和框架中
設計原則:要依賴抽象,不要依賴具體類-依賴倒置原則