意圖:定義一個用於建立對象的接口,讓子類決定建立那個類。Factory Method使一個類的實例化延遲到其子類中
動機:框架使用抽象類定義和維護對象之間的關係。這些對象的建立一般也由框架負責
適用性:
1.當一個類不知道它所必須建立的對象的類的時候
2.當一個類但願由它的子類來指定它所建立的對象的時候
3.當類將建立對象的職責委託給多個幫助子類中的某一個,而且你但願將那一個幫助子類是代理者這一信息局部化的時候
結構:html
工廠方法的實現主要有兩種狀況:java
1.Creator類是一個抽象類而且不提供它所聲明的工廠方法的實現框架
2.Creator是一個具體的類並且爲工廠方法提供一個缺省的實現ide
實例:工具
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 }
測試一下:post
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
應用:工廠方法主要應用於工具包和框架中
設計原則:要依賴抽象,不要依賴具體類-依賴倒置原則測試