工廠方法模式(Java與Kotlin版)

 

前文推送html

設計模式數據庫

簡單工廠模式(Java與Kotlin版)設計模式

 

Kotlin基礎知識ide

Kotlin入門第一課:從對比Java開始post

Kotlin入門第二課:集合操做spa

Kotlin入門第三課:數據類型設計

初次嘗試用Kotlin實現Android項目code

 

1. 定義htm

工廠方法模式(Factory Method Pattern)又稱爲工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠(Polymorphic Factory)模式,它屬於類建立型模式。在工廠方法模式中,工廠父類負責定義建立產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣作的目的是將產品類的實例化操做延遲到工廠子類中完成,即經過工廠子類來肯定究竟應該實例化哪個具體產品類。對象

 

2. 結構

Factory:抽象工廠角色,定義建立實例的抽象方法;

ConcreteFactory:具體工廠角色,負責建立特定實例;

Product:抽象產品角色,是所建立的全部對象的父類,負責描述全部實例所共有的公共接口;

ConcreteProduct:具體產品角色,是建立目標,全部建立的對象都充當這個角色的某個具體類的實例。

 

3. 代碼

3.1 Java

Product:

1 abstract class Product {
2     abstract void print(); 3 }

定義了抽象產品角色,及抽象方法print。

ConcreteProductA與ConcreteProductB:

 1 class ConcreteProductA extends Product {
 2     void print() { 3 System.out.println("print of ConcreteProductA"); 4  } 5 } 6 7 class ConcreteProductB extends Product { 8 void print() { 9 System.out.println("print of ConcreteProductB"); 10  } 11 }

定義了兩個具體產品角色,分別實現了print方法。

Factory:

1 abstract class Factory {
2     abstract Product factoryMethod();
3 }

定義了抽象工廠角色,及抽象方法factoryMethod。

ConcreteFactoryA與ConcreteFactoryB:

 1 class ConcreteFactoryA extends Factory {
 2     Product factoryMethod() {
 3         System.out.println("create ProductA");
 4 
 5         return new ConcreteProductA();
 6     }
 7 }
 8 
 9 class ConcreteFactoryB extends Factory {
10     Product factoryMethod() {
11         System.out.println("create ProductB");
12 
13         return new ConcreteProductB();
14     }
15 }

定義了兩個具體工廠角色,分別實現了factoryMethod方法。

FactoryMethodPattern:

 1 public class FactoryMethodPattern {
 2     public static void main(String[] args) {
 3         System.out.println("Factory Method Pattern");
 4 
 5         Factory factory = new ConcreteFactoryA();
 6         Product product = factory.factoryMethod();
 7         product.print();
 8 
 9         factory = new ConcreteFactoryB();
10         product = factory.factoryMethod();
11         product.print();
12     }
13 }

不一樣的具體產品實例,用不一樣的具體工廠來建立。

輸出:

 

3.2 Kotlin

Product:

1 abstract class Product {
2     abstract fun print() 3 }

ConcreteProductA與ConcreteProductB:

 1 class ConcreteProductA : Product() {
 2     override fun print() { 3 println("print of ConcreteProductA") 4  } 5 } 6 7 class ConcreteProductB : Product() { 8 override fun print() { 9 println("print of ConcreteProductB") 10  } 11 }

Factory:

1 abstract class Factory {
2     abstract fun factoryMethod(): Product
3 }

ConcreteFactoryA與ConcreteFactoryB:

 1 class ConcreteFactoryA : Factory() {
 2     override fun factoryMethod(): Product {
 3         println("create ProductA")
 4 
 5         return ConcreteProductA()
 6     }
 7 }
 8 
 9 class ConcreteFactoryB : Factory() {
10     override fun factoryMethod(): Product {
11         println("create ProductB")
12 
13         return ConcreteProductB()
14     }
15 }

FactoryMethodPattern:

 1 fun main(args: Array<String>) {
 2     println("Factory Method Pattern")
 3 
 4     var factory: Factory = ConcreteFactoryA()
 5     var product = factory.factoryMethod()
 6     product.print()
 7 
 8     factory = ConcreteFactoryB()
 9     product = factory.factoryMethod()
10     product.print()
11 }

輸出同上。

 

4. 優缺點

4.1 優勢

在工廠方法模式中,工廠方法用來建立客戶所須要的產品,同時還向客戶隱藏了哪一種具體產品類將被實例化這一細節,用戶只須要關心所需產品對應的工廠,無須關心建立細節,甚至無須知道具體產品類的類名;

基於工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。它可以使工廠能夠自主肯定建立何種產品對象,而如何建立這個對象的細節則徹底封裝在具體工廠內部。工廠方法模式之因此又被稱爲多態工廠模式,是由於全部的具體工廠類都具備同一抽象父類;

使用工廠方法模式的另外一個優勢是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的接口,無須修改客戶端,也無須修改其餘的具體工廠和具體產品,而只要添加一個具體工廠和具體產品就能夠了。這樣,系統的可擴展性也就變得很是好,徹底符合「開閉原則」。

 

4.2 缺點

在添加新產品時,須要編寫新的具體產品類,並且還要提供與之對應的具體工廠類,系統中類的個數將成對增長,在必定程度上增長了系統的複雜度,有更多的類須要編譯和運行,會給系統帶來一些額外的開銷;

因爲考慮到系統的可擴展性,須要引入抽象層,在客戶端代碼中均使用抽象層進行定義,增長了系統的抽象性和理解難度,且在實現時可能須要用到DOM、反射等技術,增長了系統的實現難度。

 

5. 適用場景

一個類不知道它所須要的對象的類:在工廠方法模式中,客戶端不須要知道具體產品類的類名,只須要知道所對應的工廠便可,具體的產品對象由具體工廠類建立;客戶端須要知道建立具體產品的工廠類;

一個類經過其子類來指定建立哪一個對象:在工廠方法模式中,對於抽象工廠類只須要提供一個建立產品的接口,而由其子類來肯定具體要建立的對象,利用面向對象的多態性和里氏代換原則,在程序運行時,子類對象將覆蓋父類對象,從而使得系統更容易擴展;

將建立對象的任務委託給多個工廠子類中的某一個,客戶端在使用時能夠無須關心是哪個工廠子類建立產品子類,須要時再動態指定,可將具體工廠類的類名存儲在配置文件或數據庫中。

相關文章
相關標籤/搜索