1. 程式人生 > >設計模式(2)簡單工廠模式

設計模式(2)簡單工廠模式

定義:簡單工廠模式(Simple Factory Pattern)屬於類的創新型模式,又叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。

型別:建立類模式

類圖:


工廠角色(Creator):這是簡單工廠模式的核心,由它負責建立所有的類的內部邏輯。當然工廠類必須能夠被外界呼叫,建立所需要的產品物件。

抽象(Product)產品角色:簡單工廠模式所建立的所有物件的父類,注意,這裡的父類可以是介面也可以是抽象類,它負責描述所有例項所共有的公共介面。

具體產品(Concrete Product)角色:簡單工廠所建立的具體例項物件,這些具體的產品往往都擁有共同的父類。

簡單工廠模式:

       簡單工廠模式解決的問題是如何去例項化一個合適的物件。

       簡單工廠模式的核心思想就是:有一個專門的類來負責建立例項的過程。

       具體來說,把產品看著是一系列的類的集合,這些類是由某個抽象類或者介面派生出來的一個物件樹。而工廠類用來產生一個合適的物件來滿足客戶的要求。

       如果簡單工廠模式所涉及到的具體產品之間沒有共同的邏輯,那麼我們就可以使用介面來扮演抽象產品的角色;如果具體產品之間有功能的邏輯或,我們就必須把這些共同的東西提取出來,放在一個抽象類中,然後讓具體產品繼承抽象類。為實現更好複用的目的,共同的東西總是應該抽象出來的。

簡單工廠模式的優缺點:

      優點:工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的資訊,決定究竟應該建立哪個具體類的物件。使用者在使用時可以直接根據工廠類去建立所需的例項,而無需瞭解這些物件是如何建立以及如何組織的。有利於整個軟體體系結構的優化。
      缺點:由於工廠類集中了所有例項的建立邏輯,這就直接導致一旦這個工廠出了問題,所有的客戶端都會受到牽連;而且由於簡單工廠模式的產品是基於一個共同的抽象類或者介面,這樣一來,當產品的種類增加的時候,即有不同的產品介面或者抽象類的時候,工廠類就需要判斷何時建立何種種類的產品,這就和建立何種種類產品的產品相互混淆在了一起,違背了單一職責,導致系統喪失靈活性和可維護性。而且更重要的是,簡單工廠模式違背了“開放封閉原則”,就是違背了“系統對擴充套件開放,對修改關閉”的原則,因為當我新增加一個產品的時候必須修改工廠類,相應的工廠類就需要重新編譯一遍。
      總結一下:簡單工廠模式分離產品的建立者和消費者,有利於軟體系統結構的優化;但是由於一切邏輯都集中在一個工廠類中,導致了沒有很高的內聚性,同時也違背了“開放封閉原則”。另外,簡單工廠模式的方法一般都是靜態的,而靜態工廠方法是無法讓子類繼承的,因此,簡單工廠模式無法形成基於基類的繼承樹結構。

典型應用:

題目:請用C++、Java、C#或VB.NET任意一種面嚮物件語言實現一個計算器控制檯程式,要求輸入兩個數和運算子號,得到結果。

類圖:


程式碼:

運算類

class Operation
{
public:	
	double numberA = 0;
	double numberB = 0;
public:
	Operation();
	~Operation();
	virtual double GetResult()
	{
		double result = 0;
		return result;
	}
};

加法類
class OperationAdd :
	public Operation
{
public:
	OperationAdd();
	~OperationAdd();
	double GetResult()
	{
		double result = 0;
		result = numberA + numberB;
		return result;
	}
};

減法類
class OperationSub :
	public Operation
{
public:
	OperationSub();
	~OperationSub();
	double GetResult()
	{
		double result = 0;
		result = numberA - numberB;
		return result;
	}
};

乘法類
class OperationMul :
	public Operation
{
public:
	OperationMul();
	~OperationMul();
	double GetResult()
	{
		double result = 0;
		result = numberA*numberB;
		return result;
	}
};

除法類
class OperationDiv :
	public Operation
{
public:
	OperationDiv();
	~OperationDiv();
	double GetResult()
	{
		double result = 0;
		if (numberB = 0)
		{
			exit(-1);
		}
		result = numberA / numberB;
		return result;
	}
};

工廠類
class OperationFactory
{
public:
	OperationFactory();
	~OperationFactory();
	static Operation *createOperate(char operate)
	{
		Operation *oper=NULL;
		switch (operate)
		{
		case '+':
		{
					oper = new OperationAdd();
					break; 
		}
		case '-':
		{
					oper = new OperationSub();
					break; 
		}
		case '*':
		{
					oper = new OperationMul();
					break; 
		}
		case '/':
		{
					oper = new OperationDiv();
					break;
		}
		default:
			break;
		}
		return oper;
	}
};

客戶端
	Operation *oper;
	char str='+';
	oper = OperationFactory::createOperate(str);
	oper->numberA = 1;
	oper->numberB = 2;
	double result = oper->GetResult();

       由客戶端我們可以看出,運用了簡單工廠模式,業務邏輯與介面邏輯就分開了,客戶端無需知道運算操作是如何實現的,就可以得到想要的結果,但是如果你需要增加功能,如平方根,立方根,自然對數等等,則不僅需要增加相關的運運算元類,還需修改工廠類,這顯然違背了開放封閉原則,如果不斷的增加功能,也會增加工廠類的運算幅度,違背了單一職責原則。

相關推薦

設計模式2----簡單工廠模式

只知道 wid lin 通過 trac 復雜 創建 調用 lvs 說明一下: 簡單工廠模式不屬於23種GOF設計模式之一,我之所以寫出來,是應為簡單工廠模式是工廠模式的基礎,23種中的工廠方法模式是從中衍生的。 簡介: 簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(St

設計模式2簡單工廠模式

定義:簡單工廠模式(Simple Factory Pattern)屬於類的創新型模式,又叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。 型別:建立類模式 類圖:

設計模式簡單工廠模式

spa 電腦 tco null 繼承 string 我們 實例 tro 相關文章 設計模式(一)設計六大原則 設計模式(二)單例模式的七種寫法 設計模式(三)建造者模式 1.簡單工廠模式簡單介紹 定義 簡單工廠模式屬於創建型模式又叫做靜

常用的軟體設計模式簡單工廠模式

剛參加工作的時候,絲毫沒有面向物件的思想,所有分支都使用一堆的if...else...,現在回頭看以前的程式碼,著實low。但是隻要一心想著進步的人,一定是會總結和反省的,為什麼以前的程式碼出現bug這麼難維護,功能擴充套件那麼難,程式碼難得到複用,過了段時間連自己寫的程式碼都不知道什麼意思。都說女

設計模式簡單工廠模式

簡單工廠模式: 用一個單獨的類來做創造例項的過程。例如加減乘除運算,可以將這些類抽象成一個基類,然後繼承,實現自己的功能,如果有其他的類要建立,只需要新建一個類,在創造例項的類中加一種情況。 類圖: 選自《大話設計模式》 public abstract class Operati

C#設計模式1——簡單工廠模式

void 例子 代碼復用 操作 inf 這樣的 man ger troy 1.什麽是簡單工廠   現實中的工廠負責生產產品,編程中的簡單工廠顧名思義就是一個生產對象的類,它的主要作用是封裝改變。我們在平時的工作必不可免的和各種數據庫打交道,我們就以一個數據庫服務類為例來分

設計模式簡單工廠模式

先來考慮一道題目: 請用C++、Java、C#或VB.NET任意一種面嚮物件語言實現一個計算器控制檯程式,要求輸入兩個數和運算子號,得到結果。 題目很簡單,我們腦海裡已經有了初步的思路和答案,寫出來可能是這樣的: class Program { static vo

大話設計模式--1簡單工廠模式

實現一個計算器控制檯程式,要求輸入兩個數和運算子號,得到結果。 我的第一反應是和書裡的是一樣的就是向下面這樣寫 /* * 要求輸入兩個數和運算子號,得到結果 * */ public class Test { public static void main(String []args) thr

設計模式C#——簡單工廠模式

推薦閱讀:  我的CSDN  我的部落格園  QQ群:704621321       工廠模式主要是為建立物件提供過渡介面

大話設計模式簡單工廠模式

簡單工廠模式就是解決不同場景下例項化物件的問題。 問題場景:做一個簡單的計算器功能,實現加減乘除的功能,要實現這個功能很簡單,但是卻又要使用到面向物件的方法,降低程式的耦合度,符合開閉原則,就沒有想象中那麼簡單,demo如下: 首先建立一個抽象的父類 Calculate,

C# 設計模式簡單工廠模式unity演示

目錄   近來打算過一下設計模式那就從簡單工廠模式開始吧。而使用設計模式就是為了提高“可維護”、“可複用”、“可擴充套件”來展開的。工廠模式可分為三類,即:簡單工廠模式、工廠模式和抽象工廠模式。 一、簡單工廠模式 1、簡單工廠模式(S

設計模式-3簡單工廠模式Simple Factory Pattern

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

小白學習JavaScript設計模式1——簡單工廠模式

前言 本人也是一名小白,自學進入了前端的這個行業,無論是前端也好,後臺也罷,都離不開敲程式碼。我自己在學習的過程中也做過許多專案,前期主要是為了練習基礎,每個專案的程式碼量比不多。後來到了一個公司實習,這是我第一次出來實習工作,之前一直都是沉浸在自己的自學中,根本不知道自己

設計模式學習筆記--簡單工廠模式工廠模式

bsp bubuko rac oid nds gen body () pri 老生長談的兩個設計模式了,這裏把這兩個設計模式對比著來總結一下。 什麽是簡單工廠模式? 簡單工廠模式:根據傳入工廠類的參數動態決定要創建哪一個產品類的實例。 UML圖如下(以實現一個計算器為例):

設計模式2工廠方法模式

sys 實例化 不同 err reat inter 設計 end 泛型 工廠方法模式: ? 定義: ? 定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方

設計模式—— 簡單工廠

echart 調用 抽象 簡單工廠模式 客戶端 工廠類 info 工具 crete 簡單工廠 簡介 簡單工廠模式屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是一個工廠對象決定創建出哪一種

設計模式-簡單工廠模式和策略模式

前言 最近開始和春哥,張鐸 ,銀平討論設計模式,成立了一個小菜變大鳥的小組,每天討論一個模式,並且把這個模式搞懂,每學一個新的模式,再回顧一下之前學的模式。這兩天學了簡單工廠模式和策略模式,發現兩個模式有很多相同之處,下面用商場促銷的例子來對兩個模式總結一下。 簡單工廠模式 1.

設計模式學習總結1簡單工廠模式工廠方法模式、抽象工廠模式

設計模式學習 做了幾個專案,發現設計模式的好處還是很多的,這東西就是隻有你真正用到的時候才知道他的好處,否則學了也不知道所以然。所以設計模式學習我認為可以在先進行幾個專案後,再來學習,這樣學習的效果和感受才是最好的。 這次是做一個學習的筆記,內容還是主要以我看的兩本書《大

設計模式——簡單工廠工廠方法的異同

一、簡單工廠 1.定義: 簡單工廠模式(Simple Factory  Pattern):又稱為靜態工廠方法(Static Factory Method)模式。它屬於類建立型模式,在簡單工廠模式中,可以根據引數的不同返回不同型別的例項。簡單工廠模式專門定義一個類來負責建立其他的

設計模式練習1——簡單工廠模式

簡單工廠模式 一、題目: 使用簡單工廠模式模擬女媧(Nvwa)造人(Person),如果傳入引數M,則返回一個Man物件,如果傳入引數W。則返回一個物件Woman,用java語言實現該場景。現在需要