設計模式_工廠設計模式
阿新 • • 發佈:2018-05-06
abstract one 設計 客戶 inter ESS image sig new
工廠模式的定義:
Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.
定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
工廠模式通用類圖:
1.提取出來一個抽象產品類
1 package cn.rocker.designpattern.factory; 2 3 /** 4* @author rocker 5 * @version V1.0 6 * @Description: 抽象產品類 7 * @date 2018/5/6 17:09 8 */ 9 public abstract class Product { 10 //產品類的公共方法 11 public void method1(){ 12 //業務處理邏輯 13 } 14 15 //抽象方法 16 public abstract void method2(); 17 }
2.根據不同需求,實現不同的產品類
1 package cn.rocker.designpattern.factory;2 3 /** 4 * @author rocker 5 * @version V1.0 6 * @Description: 產品實現類1 7 * @date 2018/5/6 17:11 8 */ 9 public class ConcreteProduct1 extends Product{ 10 @Override 11 public void method2() { 12 //業務邏輯處理 13 System.out.println("ConcreteProduct1 is made..."); 14 } 15 }
1 package cn.rocker.designpattern.factory; 2 3 /** 4 * @author rocker 5 * @version V1.0 6 * @Description: 產品實現類2 7 * @date 2018/5/6 17:12 8 */ 9 public class ConcreteProduct2 extends Product{ 10 @Override 11 public void method2() { 12 //業務處理邏輯 13 System.out.println("ConcreteProduct2 is made..."); 14 } 15 }
3.提取出來一個工廠的抽象類
1 package cn.rocker.designpattern.factory; 2 3 /** 4 * @author rocker 5 * @version V1.0 6 * @Description: 創建一個產品對象,其實如參數類型可以自行設置 7 * 通常為String、Enum、Class等,當然也可以為空 8 * @date 2018/5/6 17:13 9 */ 10 public abstract class Creator { 11 public abstract <T extends Product> T createProduct(Class<T> c); 12 }
4.根據抽象類,在實現類中,實現具體的生產方法
1 package cn.rocker.designpattern.factory; 2 3 /** 4 * @author rocker 5 * @version V1.0 6 * @Description: 具體如何生產一個產品的對象,是由具體的工廠類實現的 7 * @date 2018/5/6 17:33 8 */ 9 public class ConcreteCreator extends Creator{ 10 @Override 11 public <T extends Product> T createProduct(Class<T> c) { 12 Product product = null; //工廠知道產品的抽象類,其他的實現類不關心,符合解耦的思想 13 try { 14 product = (Product) Class.forName(c.getName()).newInstance(); 15 } catch (InstantiationException e) { 16 e.printStackTrace(); 17 } catch (IllegalAccessException e) { 18 e.printStackTrace(); 19 } catch (ClassNotFoundException e) { 20 e.printStackTrace(); 21 } 22 return (T)product; 23 } 24 }
5.在客戶端通過操作工廠類,獲取具體的產品類
1 package cn.rocker.designpattern.factory; 2 3 4 import org.junit.Test; 5 6 /** 7 * @author rocker 8 * @version V1.0 9 * @Description: 用工廠生產產品 10 * @date 2018/5/6 17:36 11 */ 12 public class Client { 13 @Test 14 public void test(){ 15 //創建工廠 16 Creator creator = new ConcreteCreator(); 17 18 //生產ConcreteProduct1 19 ConcreteProduct1 product1 = creator.createProduct(ConcreteProduct1.class); 20 product1.method2(); 21 22 //生產ConcreteProduct2 23 ConcreteProduct2 product2 = creator.createProduct(ConcreteProduct2.class); 24 product2.method2(); 25 } 26 }
設計模式_工廠設計模式