1. 程式人生 > >設計模式_工廠設計模式

設計模式_工廠設計模式

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 }

技術分享圖片

設計模式_工廠設計模式