1. 程式人生 > >JAVA設計模式之工廠模式(簡單工廠模式+工廠方法模式)

JAVA設計模式之工廠模式(簡單工廠模式+工廠方法模式)

 在面向物件程式設計中, 最通常的方法是一個new操作符產生一個物件例項,new操作符就是用來構造物件例項的。但是在一些情況下, new操作符直接生成物件會帶來一些問題。舉例來說, 許多型別物件的創造需要一系列的步驟: 你可能需要計算或取得物件的初始設定; 選擇生成哪個子物件例項; 或在生成你需要的物件之前必須先生成一些輔助功能的物件。 在這些情況,新物件的建立就是一個 “過程”,不僅是一個操作,像一部大機器中的一個齒輪傳動。

模式的問題:你如何能輕鬆方便地構造物件例項,而不必關心構造物件例項的細節和複雜過程呢?

解決方案:建立一個工廠來建立物件

實現:

一、引言
   1)還沒有工廠時代:假如還沒有工業革命,如果一個客戶要一款寶馬車,一般的做法是客戶去建立一款寶馬車,然後拿來用。
    2)簡單工廠模式:後來出現工業革命。使用者不用去建立寶馬車。因為客戶有一個工廠來幫他建立寶馬.想要什麼車,這個工廠就可以建。比如想要320i系列車。工廠就建立這個系列的車。即工廠可以建立產品。
    3)工廠方法模式時代:為了滿足客戶,寶馬車系列越來越多,如320i,523i,30li等系列一個工廠無法建立所有的寶馬系列。於是由單獨分出來多個具體的工廠。每個具體工廠建立一種系列。即具體工廠類只能建立一個具體產品。但是寶馬工廠還是個抽象。你需要指定某個具體的工廠才能生產車出來。

   4)抽象工廠模式時代:隨著客戶的要求越來越高,寶馬車必須配置空調。於是這個工廠開始生產寶馬車和需要的空調。

最終是客戶只要對寶馬的銷售員說:我要523i空調車,銷售員就直接給他523i空調車了。而不用自己去建立523i空調車寶馬車.

   這就是工廠模式。

二、分類
        工廠模式主要是為建立物件提供過渡介面,以便將建立物件的具體過程遮蔽隔離起來,達到提高靈活性的目的。 
工廠模式可以分為三類: 

1)簡單工廠模式(Simple Factory) 
2)工廠方法模式(Factory Method) 
3)抽象工廠模式(Abstract Factory) 

這三種模式從上到下逐步抽象,並且更具一般性。 


        GOF在《設計模式》一書中將工廠模式分為兩類:工廠方法模式(Factory Method)與抽象工廠模式(Abstract Factory)。

        將簡單工廠模式(Simple Factory)看為工廠方法模式的一種特例,兩者歸為一類。 

三、區別 
工廠方法模式:
一個抽象產品類,可以派生出多個具體產品類。   
一個抽象工廠類,可以派生出多個具體工廠類。   
每個具體工廠類只能建立一個具體產品類的例項。
抽象工廠模式:
多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。   
一個抽象工廠類,可以派生出多個具體工廠類。   
每個具體工廠類可以建立多個具體產品類的例項。   
區別:
工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。   
工廠方法模式的具體工廠類只能建立一個具體產品類的例項,而抽象工廠模式可以建立多個。


兩者皆可。 

 四、簡單工廠模式 
建立一個工廠(一個函式或一個類方法)來製造新的物件。
分佈說明引子:從無到有。客戶自己建立寶馬車,然後拿來用。

 

public class BMW320 {
	public BMW320(){
		System.out.println("製造-->BMW320");
	}
}

public class BMW523 {
	public BMW523(){
		System.out.println("製造-->BMW523");
	}
}

public class Customer {
	public static void main(String[] args) {
		BMW320 bmw320 = new BMW320();
		BMW523 bmw523 = new BMW523();
	}
}

客戶需要知道怎麼去建立一款車,客戶和車就緊密耦合在一起了.為了降低耦合,就出現了工廠類,把建立寶馬的操作細節都放到了工廠裡面去,客戶直接使用工廠的建立工廠方法,傳入想要的寶馬車型號就行了,而不必去知道建立的細節.這就是工業革命了:簡單工廠模式

即我們建立一個工廠類方法來製造新的物件。如圖:

產品類:

abstract class BMW {
	public BMW(){
		
	}
}

public class BMW320 extends BMW {
	public BMW320() {
		System.out.println("製造-->BMW320");
	}
}
public class BMW523 extends BMW{
	public BMW523(){
		System.out.println("製造-->BMW523");
	}
}

工廠類:

public class Factory {
	public BMW createBMW(int type) {
		switch (type) {
		
		case 320:
			return new BMW320();

		case 523:
			return new BMW523();

		default:
			break;
		}
		return null;
	}
}


客戶類:

public class Customer {
	public static void main(String[] args) {
		Factory factory = new Factory();
		BMW bmw320 = factory.createBMW(320);
		BMW bmw523 = factory.createBMW(523);
	}
}

   簡單工廠模式又稱靜態工廠方法模式。重新命名上就可以看出這個模式一定很簡單。它存在的目的很簡單:定義一個用於建立物件的介面。 
      先來看看它的組成: 
         1) 工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯,用來建立產品
         2) 抽象產品角色:它一般是具體產品繼承的父類或者實現的介面。         
         3) 具體產品角色:工廠類所建立的物件就是此角色的例項。在java中由一個具體類實現。 

        下面我們從開閉原則(對擴充套件開放;對修改封閉)上來分析下簡單工廠模式。當客戶不再滿足現有的車型號的時候,想要一種速度快的新型車,只要這種車符合抽象產品制定的合同,那麼只要通知工廠類知道就可以被客戶使用了。所以對產品部分來說,它是符合開閉原則的;但是工廠部分好像不太理想,因為每增加一種新型車,都要在工廠類中增加相應的建立業務邏輯(createBMW(int type)方法需要新增case),這顯然是違背開閉原則的。可想而知對於新產品的加入,工廠類是很被動的。對於這樣的工廠類,我們稱它為全能類或者上帝類。 
        我們舉的例子是最簡單的情況,而在實際應用中,很可能產品是一個多層次的樹狀結構。由於簡單工廠模式中只有一個工廠類來對應這些產品,所以這可能會把我們的上帝累壞了,也累壞了我們這些程式設計師。
        於是工廠方法模式作為救世主出現了。 工廠類定義成了介面,而每新增的車種型別,就增加該車種型別對應工廠類的實現,這樣工廠的設計就可以擴充套件了,而不必去修改原來的程式碼。
五、工廠方法模式 
        工廠方法模式去掉了簡單工廠模式中工廠方法的靜態屬性,使得它可以被子類繼承。這樣在簡單工廠模式裡集中在工廠方法上的壓力可以由工廠方法模式裡不同的工廠子類來分擔。 
工廠方法模式組成: 
       1)抽象工廠角色: 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。在java中它由抽象類或者介面來實現。 
       2)具體工廠角色:它含有和具體業務邏輯有關的程式碼。由應用程式呼叫以建立對應的具體產品的物件。 
       3)抽象產品角色:它是具體產品繼承的父類或者是實現的介面。在java中一般有抽象類或者介面來實現。 
       4)具體產品角色:具體工廠角色所建立的物件就是此角色的例項。在java中由具體的類來實現。 
       工廠方法模式使用繼承自抽象工廠角色的多個子類來代替簡單工廠模式中的“上帝類”。正如上面所說,這樣便分擔了物件承受的壓力;而且這樣使得結構變得靈活 起來——當有新的產品產生時,只要按照抽象產品角色、抽象工廠角色提供的合同來生成,那麼就可以被客戶使用,而不必去修改任何已有 的程式碼。可以看出工廠角色的結構也是符合開閉原則的! 

程式碼如下: 

產品類:

abstract class BMW {
	public BMW(){
		
	}
}
public class BMW320 extends BMW {
	public BMW320() {
		System.out.println("製造-->BMW320");
	}
}
public class BMW523 extends BMW{
	public BMW523(){
		System.out.println("製造-->BMW523");
	}
}


建立工廠類:

interface FactoryBMW {
	BMW createBMW();
}

public class FactoryBMW320 implements FactoryBMW{

	@Override
	public BMW320 createBMW() {

		return new BMW320();
	}

}
public class FactoryBMW523 implements FactoryBMW {
	@Override
	public BMW523 createBMW() {

		return new BMW523();
	}
}


客戶類:

public class Customer {
	public static void main(String[] args) {
		FactoryBMW320 factoryBMW320 = new FactoryBMW320();
		BMW320 bmw320 = factoryBMW320.createBMW();

		FactoryBMW523 factoryBMW523 = new FactoryBMW523();
		BMW523 bmw523 = factoryBMW523.createBMW();
	}
}


工廠方法模式彷彿已經很完美的對物件的建立進行了包裝,使得客戶程式中僅僅處理抽象產品角色提供的介面,但使得物件的數量成倍增長。當產品種類非常多時,會出現大量的與之對應的工廠物件,這不是我們所希望的。

參考http://blog.csdn.net/hguisu/article/details/7505909

以上就是簡單工廠模式,工廠方法模式,抽象工廠模式在這裡

作者:jason0539

相關推薦

Java設計模式Singleton——四種不同的單例模式(Singleton)

單例模式(Singleton [?sglt?n]) 如果要保證系統裡最多隻能存在一個例項時,我們就需要單例模式。例如快取池、資料庫連線池等。 例項一:最簡單的單例模式 因為JVM在載入類時,對於static屬性的初始化只能由一個執行緒執行且僅執行一次,並且return操

Java設計模式從[遊戲場景讀取]分析代理(Proxy)模式

  在大型遊戲中(如刺客信條、使命召喚等),我們需要讀取的地圖往往是很大的。如果我們在進入遊戲時,把所有的地圖資訊都讀出來,會花費很多的時間。那麼,為了提高效率,我們採取的措施是,我們並不需要真正把這些元素讀取出來,可以先用一些“不怎麼需要時間開銷的替代品”(也就是我們談到

Java設計模式從[Dota地圖]分析享元(Flyweight)模式

  在Dota遊戲的地圖中有幾百棵樹,現在假設這些樹木無非是這兩種:白楊、楓樹,數量一共為400棵,那麼,在裝載這個地圖場景的時候,我們是不是應該給這400課樹一一建立物件呢?(如:MapItem tree1 = new MapItem("白楊");MapItem tree

23種設計模式(二十三)迭代器模式(python_c++實現) .md

23種設計模式之(二十三)迭代器模式(Iterator) 本文主要介紹23種設計模式之迭代器模式,附詳細python/c++示例程式碼。 概念 應用場景 注意事項 程式碼示例 總結 程式碼連結 迭代器模式(Iterator) 概念 迭代模式,是行為模式之一

設計模式 _第四招式_模版方法模式

一、定義 定義一個操作中的演算法框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。模版方法模式確實非常簡單,僅使用了Java的繼承機制,是一種應用非常廣泛的模式。 模版方法模式通用類圖如下: AbstractClass叫做抽象模

Java設計思想遞迴繼承

一個軟體實體如類、模組和函式應該對擴充套件開放,對修改關閉。 Softeware entities like classes,modules and functions should be open for extension but closed for modifications. 開閉原則的含義

java記憶體分配堆,棧,常量池,方法

java棧 java棧,在函式的定義中定義的基本型別(int,long,short,byte,float,double,boolean,char)的變數資料和物件的引用變數分配的儲存空間的地方。當在程式碼塊中定義一個變數時,java棧就為這個變數分配適當的記憶體空間,當該變數退出作用域時,jav

黑馬程式設計師--Java學習日記面向物件(封裝,繼承和構造方法)

------- android培訓、java培訓、期待與您交流! ---------- 面向物件思想:     面向過程,以函式為基礎,關注的是實現過程;     面向物件,以物件為基礎,關注的是最終結果; 面向物件思想特點         是一種更符合我們思想習慣的思想

Java設計模式 簡單工廠模式(二)

attack reat nds public create mark mar ace cto 下面的代碼是稍微改進後的工廠模式 abstract class MoveAble{ public abstract void run(); } abstract c

Java設計模式(一)建立型模式工廠模式簡單工廠模式+工廠方法模式

在面向物件程式設計中, 最通常的方法是一個new操作符產生一個物件例項,new操作符就是用來構造物件例項的。但是在一些情況下, new操作符直接生成物件會帶來一些問題。舉例來說,許多型別物件的建立需要一系列的步驟:你可能需要計算或取得物件的初始位置;選擇生成哪個子物件例項;或在你生成你需要的物件

大話設計模式簡單工廠模式Java版)

大話設計模式——第一章(簡單工廠模式)   題目:請用C++、Java、C#或VB.NET任意一種面嚮物件語言實現一個計算器控制檯程式,要求輸入兩個數和運算子號,得到結果。 import java.io.Console; import java.util.Scanner; /**

java設計模式簡單工廠

package com.jiangwg.psj.design; import java.util.Scanner; /** * @Auther: Peng Senjie * @Date: 2018-09-14 * @Description: 簡單工廠模式 */

Java設計模式簡單工廠模式

工廠模式:就是我們最常用的例項化物件模式,是用工廠方法代替new操作的一種模式。 實現步驟:使用工廠物件,根據傳遞的引數建立物件 ex: /** * 簡單工廠模式:就是建立一個工廠專門用來new

java 設計模式01簡單工廠和抽象工廠模式

總結一下: 簡單工廠:工廠根據條件去建立對應的具體實現物件,如果需要增加新的物件,就必須修改建立物件的介面,增加判斷條件,另外可能建立的物件下面的方法也可能有其他物件去實現相同的功能,造成混亂,比如,amd可以造cpu,也可以造網絡卡,不能建立了一個amd造cpu的

java設計模式——簡單工廠工廠方法模式、抽象工廠模式(建立性)【讀書筆記】

1、簡單工廠模式            應用場景,程式設計中通過工廠方法接受一個引數,建立不同類型別的例項。            設計示意圖                                         例項                  

JAVA設計模式工廠模式(簡單工廠模式+工廠方法模式)

 在面向物件程式設計中, 最通常的方法是一個new操作符產生一個物件例項,new操作符就是用來構造物件例項的。但是在一些情況下, new操作符直接生成物件會帶來一些問題。舉例來說, 許多型別物件的創造需要一系列的步驟: 你可能需要計算或取得物件的初始設定; 選擇生成哪個子物件

java設計模式策略模式簡單工廠模式

簡單工廠模式:將物件交由工廠來生成。 策略模式: 主要與演算法有關。 定義了演算法家族,分別封裝起來,讓它們直接可以相互替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。 與簡單工廠模式相結合

Java[Android]設計模式工廠模式(簡單工廠模式+工廠方法模式+抽象工廠模式)

1. 寫在前面  網上關於設計模式的文章已經非常詳盡了,寫這篇文章旨在給自己的學習做一個筆記和總結方便以後翻閱查詢,若對你有用可細學之若覺得膚淺可略之。  工廠模式屬於建立型設計模式,分為簡單工廠模式,工廠方法模式,抽象工廠模式三種,話不多說,請看下面一一道來。2. 簡單工廠

JAVA設計模式工廠模式(簡單工廠模式+工廠方法模式+抽象工廠模式)

http://blog.csdn.net/jason0539/article/details/23020989 http://blog.csdn.net/jason0539/article/details/44976775

java 設計模式簡單工廠模式(含樣例源碼)

ace org build cep 說明 pad 客戶 enc trac 簡單工廠模式的目的:使得對象的創建和使用分離,降低系統耦合,對用戶隱藏類的實例創建細節 簡單工廠模式屬於創建型模式的一種 簡單工廠模式的定義:定義一個工廠類,它可以根據參數的不同返回不