設計模式詳解篇--2.創建型模式

創建型模式關注點是如何創建對象,其核心思想是要把對象的創建和使用相分離,這樣使得兩者能相對獨立地變換。

創建型模式包括:

  • 工廠方法:Factory Method
  • 抽象工廠:Abstract Factory
  • 建造者:Builder
  • 原型:Prototype
  • 單例:Singleton

1.工廠方法模式

  • 定義一個用於創建對象的接口,讓子類決定實例化哪一個類。
  • Factory Method使一個類的實例化延遲到其子類。
  • 工廠方法即Factory Method,是一種對象創建型模式。工廠方法的目的是使得創建對象和使用對象是分離的,並且客戶端總是引用抽象工廠和抽象產品:

實例應用

需求:
披薩項目的需求:客戶在點餐的時候,可以點不同的口味,比如是北京的奶酪pizza、北京的胡椒pizza,倫敦的奶酪pizza、倫敦的胡椒pizza,

思路1:
使用簡單工廠模式,創建不同的簡單工廠,比如BJPizzaSimpleFactory等

思路2:
使用工廠方法模式:定義一個創建對象的抽象方法,由子類決定實例化的類,工廠方法模式將對象的實例化推遲到子類

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NDMnVQDA-1590158099969)(en-resource://database/2450:1)]

資料參考:
[設計模式資料](%3Ca href=“https://www.cnblogs.com/V1haoge/p/10491982.html”%3Ehttps://www.cnblogs.com/V1haoge/p/10491982.html%3C/a%3E)

使用場景

MyBatis中使用的比較多,事務模塊和數據源模塊都使用了工廠方法模式。

2.抽象工廠模式

提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。抽象工廠模式(Abstract Factory)是一個比較複雜的創建型模式。抽象工廠模式和工廠方法不太一樣,它要解決的問題比較複雜,不但工廠是抽象的,產品是抽象的,而且有多個產品需要創建,因此,這個抽象工廠會對應到多個實際工廠,每個實際工廠負責創建多個實際產品:

使用場景

抽象工廠一般zd包含三層架構,他真正的作用是可以隨時更改數據庫的類型。

3.生成器模式

生成器模式(Builder)是使用多個“小型”工廠來最終創建出一個完整對象。當我們使用Builder的時候,一般來說,是因爲創建這個對象的步驟比較多,每個步驟都需要一個零部件,最終組合成一個完整的對象。

4.原型模式

原型模式,即Prototype,是指創建新對象的時候,根據現有的一個原型來創建。我們舉個例子:如果我們已經有了一個String[]數組,想再創建一個一模一樣的String[]數組,怎麼寫?實際上創建過程很簡單,就是把現有數組的元素複製到新數組。如果我們把這個創建過程封裝一下,就成了原型模式

使用場景

JAVA 中的 Object clone() 方法。

通過 new 產生一個對象需要非常繁瑣的數據準備或訪問權限,則可以使用原型模式

一個對象需要提供給其他對象訪問,而且各個調用者可能都需要修改其值時,可以考慮使用原型模式拷貝多個對象供調用者使用。

5.單例模式

保證一個類僅有一個實例,並提供一個訪問它的全局訪問點

單例模式(Singleton)的目的是爲了保證在一個進程中,某個類有且僅有一個實例。因爲這個類只有一個實例,因此,自然不能讓調用方使用new Xyz()來創建實例了。所以,單例的構造方法必須是private,這樣就防止了調用方自己創建實例,但是在類的內部,是可以用一個靜態字段來引用唯一創建的實例的:

public class Singleton {
// 靜態字段引用唯一實例:
private static final Singleton INSTANCE = new Singleton();

// private構造方法保證外部無法實例化:
private Singleton() {
}
}

所以,單例模式的實現方式很簡單:

  • 只有private構造方法,確保外部無法實例化;
  • 通過private static變量持有唯一實例,保證全局唯一性;
  • 通過public static方法返回此唯一實例,使外部調用方能獲取到實例。

使用場景

例模式只允許創建一個對象,因此節省內存,加快對象訪問速度,因此對象需要被公用的場合適合使用,如多個模塊使用同一個數據源連接對象

資源共享的情況下,避免由於資源操作時導致的性能或損耗等。如上述中的日誌文件,應用配置。

網站的計數器,一般也是採用單例模式實現,否則難以同步。

多線程的線程池的設計一般也是採用單例模式,這是由於線程池要方便對池中的線程進行控制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章