1. 程式人生 > >工廠模式,工廠方法模式,抽象工廠模式 詳解

工廠模式,工廠方法模式,抽象工廠模式 詳解

1. 工廠模式

1.1 描述

簡單工廠模式是由一個工廠物件根據收到的訊息決定要建立哪一個類的物件例項。

1.2 使用場景

工廠類負責建立的物件比較少,客戶只需要傳入工廠類引數,對於如何建立物件(邏輯)不關心。簡單工廠模式很容易違反高內聚低耦合的原則,因此一般只在很簡單的情況下使用。

1.3 優點

最大的優點在於工廠類中包含了必要的邏輯,根據客戶需要的邏輯動態例項化相關的類。

1.4 例子

public interface Shape {
	
	public void draw();
	
}
public class Circle implements Shape {

	@Override
	public void draw() {
		System.out.println("Inside Circle::draw() method.");
	}

}
public class Rectangle implements Shape {

	@Override
	public void draw() {
		System.out.println("Inside Rectangle::draw() method.");
	}

}
public class Square implements Shape {

	@Override
	public void draw() {
		System.out.println("Inside Square::draw() method.");
	}

}
public class ShapeFactory {
	
	public Shape getShape(String type) {
		if ("circle".equals(type)) {
			return new Circle();
		} else if ("rectangle".equals(type)) {
			return new Rectangle();
		} else if ("square".equals(type)) {
			return new Square();
		} else {
			return null;
		}
	}
	
}
public class FactoryPatternDemo {
	
	public static void main(String[] args) {
		ShapeFactory shapeFactory = new ShapeFactory();
		shapeFactory.getShape("circle").draw();
		shapeFactory.getShape("rectangle").draw();
		shapeFactory.getShape("square").draw();
	}

}

2. 工廠方法模式

2.1 描述

定義一個建立物件的工廠介面,讓子類決定例項化哪一個類,將實際建立工作推遲到子類當中。

2.2 使用場景

 1、日誌記錄器:記錄可能記錄到本地硬碟、系統事件、遠端伺服器等,使用者可以選擇記錄日誌到什麼地方。 2、資料庫訪問,當用戶不知道最後系統採用哪一類資料庫,以及資料庫可能有變化時。 3、設計一個連線伺服器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作為產品類,共同實現一個介面。

2.3 優點

建立物件的介面,讓子類決定具體例項化的物件,把簡單的內部邏輯判斷移到了客戶端。工廠方法模式克服了簡單工廠所違背的開閉原則的缺點,又保持了封裝物件建立過程的優點。擴充套件性高,想要增加一個產品,只要擴充套件一個工廠類就可以。

2.4 例子

public interface ShapeFactory {
	
	public Shape getShape();
	
}
public class CircleFactory implements ShapeFactory {

	@Override
	public Shape getShape() {
		return new Circle();
	}

}
public class RectangleFactory implements ShapeFactory {

	@Override
	public Shape getShape() {
		return new Rectangle();
	}

}
public class SquareFactory implements ShapeFactory {

	@Override
	public Shape getShape() {
		return new Square();
	}

}
public class FactoryMethodDemo {
	
	public static void main(String[] args) {
		ShapeFactory circleFactory = new CircleFactory();
		circleFactory.getShape().draw();
		ShapeFactory rectangleFactory = new RectangleFactory();
		rectangleFactory.getShape().draw();
		ShapeFactory squareFactory = new SquareFactory();
		squareFactory.getShape().draw();
	}

}

3. 抽象工廠


3.1 描述

抽象工廠是圍繞一個超級工廠建立其他工廠,該超級工廠又稱為其他工廠的工廠。提供一個建立一系列相關或相互依賴物件的介面,而無需指定他們具體的類。

3.2 使用場景

系統的產品多於一個產品族,而系統只消費某一族的產品。

3.3 優點

當一個產品族中的多個物件被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的物件。

3.4 例子

public interface Button {
	
	public void processEvent();
	
}
public interface Text {
	
	public void getWholeText();
	
}
public class LinuxButton implements Button {

	@Override
	public void processEvent() {
		System.out.println("Inside LinuxButton::processEvent() method.");
	}

}
public class WindowsButton implements Button {

	@Override
	public void processEvent() {
		System.out.println("Inside WindowsButton::processEvent() method.");
	}

}
public class LinuxText implements Text {

	@Override
	public void getWholeText() {
		System.out.println("Inside LinuxText::getWholeText() method.");
	}

}
public class WindowsText implements Text {

	@Override
	public void getWholeText() {
		System.out.println("Inside WindowsText::getWholeText() method.");
	}

}
public interface AbstractFactory {
	
	public Button createButton();
	
	public Text createText();

}
public class LinuxFactory implements AbstractFactory {

	@Override
	public Button createButton() {
		return new LinuxButton();
	}

	@Override
	public Text createText() {
		return new LinuxText();
	}

}
public class WindowsFactory implements AbstractFactory {

	@Override
	public Button createButton() {
		return new WindowsButton();
	}

	@Override
	public Text createText() {
		return new WindowsText();
	}

}
public class AbstractFactoryDemo {
	
	public static void main(String[] args) {
		AbstractFactory linuxFactory = new LinuxFactory();
		linuxFactory.createButton().processEvent();
		linuxFactory.createText().getWholeText();
		AbstractFactory windowsFactory = new WindowsFactory();
		windowsFactory.createButton().processEvent();
		windowsFactory.createText().getWholeText();
	}

}

4. 總結

無論是簡單工廠模式,工廠方法模式,還是抽象工廠模式,他們都屬於工廠模式,在形式和特點上也是極為相似的,他們的最終目的都是為了解耦。在使用時,我們不必去在意這個模式到底工廠方法模式還是抽象工廠模式,因為他們之間的演變常常是令人琢磨不透的。經常你會發現,明明使用的工廠方法模式,當新需求來臨,稍加修改,加入了一個新方法後,由於類中的產品構成了不同等級結構中的產品族,它就變成抽象工廠模式了;而對於抽象工廠模式,當減少一個方法使的提供的產品不再構成產品族之後,它就演變成了工廠方法模式。
       所以,在使用工廠模式時,只需要關心降低耦合度的目的是否達到了。










相關推薦

2抽象工廠模式(Abstract Factory Pattern) 抽象工廠可以一下生產一個產品族(裏面有很多產品組成)

creat name hba abstract 模式 存在 names cto 園區 備註  工廠模式:要麽生產香蕉、要麽生產蘋果、要麽生產西紅柿;但是不能同時生產一個產品組。     抽象工廠:能同時生產一個產品族。===》抽象工廠存在原因 解釋 : 具體工廠

設計模式 c++版(5)——抽象工廠模式

定義:為建立一組相關或相互依賴的物件提供一個介面,而且無需指定它們的具體類 示例一:女媧造人擴充套件 造出來黑、白、黃種人,分別有性別分類 類圖說明:一個介面,多個抽象類,N個實現類,每個人種都是一個抽象類,性別是在各個實現類中實現的。 1. 結構說明: HumanF

設計模式與XML(一)抽象工廠和反射機制(C++)

一、實驗目的及要求 1、掌握建立型模式的概念。 2、掌握工廠模式、抽象工廠模式、單例模式、建造者模式、原型模式的構造方式及使用情景。 二、實驗裝置(環境) 1、   軟體需求: Dev-Cpp5.4, Rational Rose / Microsoft Visio

設計模式的學習--(4)抽象工廠模式

抽象工廠模式 –產品族的建立 抽線工廠模式的定義:提供一個建立一系列相關或相互依賴物件的介面,而無須指定他們具體的類。抽象工廠模式又稱為Kit模式,它是一種物件建立型模式。和工廠方法模式不同的地方在於抽象工廠模式是提供了建立一系列類的例項的工廠方法。 還是拿

大話設計模式C++實現-第15章-抽象工廠模式

一、UML圖 二、概念 抽象方法模式(Abstract Factory):提供一個建立一系列相關或互相依賴物件的介面,而無需指定他們具體的類。 三、包含的角色 (1)抽象工廠 (2)具體工廠:包括具體工廠1和具體工廠2。具體工廠1用於生產具體產品A1和具體產品B1,具體

設計模式——把類作為引數的抽象工廠模式

今天給大家介紹一個非常簡單的設計模式,一學就會,非常好用。 這個模式叫做抽象工廠模式,大家可能對工廠模式比較熟悉,在工廠模式當中封裝了例項的建立邏輯。主要的用途一般是將一些複雜的類的建立過程整合在一起,通過引數控制,這樣使用者可以較簡單地獲得例項。 抽象工廠 抽象工廠模式和工廠模式類似,只不過更加抽象了一層。

Java棧PC寄存器本地方法方法區(靜態區)和運行常量池

局部變量 fan log 變量 實例 分析 創建 china java棧 https://my.oschina.net/wangsifangyuan/blog/711329 前言:當要判斷一個變量存在什麽空間上時,先分析它是哪一種(是實例變量還是局部變量),實例變量存在於所

靜態內部類定義在類中任何方法用static定義

static sys 需要 有一個 out col 定義 pub 不可 靜態內部類:(註意:前三種內部類與變量類似,所以可以對照參考變量) 靜態內部類定義在類中,任何方法外,用static定義。 靜態內部類只能訪問外部類的靜態成員。 生成(new)一個靜態內部類不需要外部類

c++編寫ocx控制元件新增方法在c#中看不到該方法

前兩天遇到個問題,公司之前做的ocx控制元件需要新增新的介面,於是我就在類資源中右鍵->新增方法;增加了新的方法;但是編譯完成後,c#的工程呼叫時總是看不到新新增的方法,於是試了很多方法 1. 檢查新新增的方法與之前的老方法具體有沒有差別,檢查是不是新增錯了 2. 清理工程,然後rebui

【為什麼學習模板方法(Template Method)模式和模板方法(Template Method)模式主要解決的問題】

轉載 https://blog.csdn.net/eson_15/article/details/51323902 1. 模板方法的一個例項         這一節主要來學習一下設計模式中的模板方法模式。我們先來看一個例子:假如現在老闆讓你做一個汽車的模型,要求只要完成基

java GC 棧(虛擬機器棧本地方法棧)堆(新生代、老年代) 方法區(永久帶)等引數配置

-Xms 初始堆大小。如:-Xms256m -Xmx 最大堆大小。如:-Xmx512m -Xmn 新生代大小。通常為 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 個 Su

elementui 一個頁面有多個upload元件 共用方法怎麼傳自己的引數

https://www.cnblogs.com/steamed-twisted-roll/p/9473644.html &nbs

在Linux裏防止文件被刪除(chattr命令)

chattr1. 概述linux中鍵入“man chattr”,其描述為“chattr changes the file attributes on a Linux file system.”從這我們很容易得出:在Linux文件系統裏,chattr是可以改變文件的屬性。2. 具體的語法格式chattr [ -

Python Web開發中WSGI協議的作用和實現原理

首先理解下面三個概念: WSGI:全稱是Web Server Gateway Interface,WSGI不是伺服器,python模組,框架,API或者任何軟體,只是一種規範,描述web server如何與web application通訊的規範。 uwsgi:與WSGI一樣是一種協議,是uWSGI伺服器

【小卒ubantu使用】ubantu環境下的.egg檔案是什麼如何安裝、解除安裝、使用

       egg的英文意思是蛋,俗稱蟒蛇的蛋,python的egg檔案有點像java中的jar檔案,是一個工程包檔案,便於安裝部署 如何製作egg檔案呢?see官方文件http://peak.telecommunity.com/De

koa2+webpack4+React+pm2純手工架子搭建SSR專案入門教程以及流程指引:手把手教你實現服務端首屏渲染SSR專案

本人全職喵姐,兼職程式設計師,才疏學淺,大神如果有好的idea能指點迷津的話感激不盡。以下專案為純手工搭建的Webpack4+React+KOA2+PM2前端豆腐渣工程,房子的簡陋模型,入門教程以及流程指引。後續要精裝修還是蓋茅草屋看你自己了……/微微笑(自帶表情包)……先學習…...

扒一扒使用boostrap-fileinput上傳外掛遇到的坑Bootstrap-fileinput上傳外掛的使用

轉自 https://blog.csdn.net/zlb_lover/article/details/76548772 由於公司專案的需求,需要實現動植物名錄的新增,包括姓名等資訊和圖片等,需要使用bootstrap-fileinput的上傳外掛,在提交新增介面

原來資料庫中的模糊查詢分組聯合查詢是這麼使用的(

1 模糊查詢 like關鍵字 萬用字元 % 任意長度的任意字串 _ 代表任意一個字元 [1-6] 代表1到6之間的一個字元 [^0-5] 代表不是0到5之間的一個字元 between 值1 and 值2 select * from 表名 where 列

java的堆靜態程式碼區(常量區)

String s="java";和String s=new String("java");的區別這個問題困擾了我很久,搜到這篇文章,寫得炒雞棒!!! 一:在JAVA中,有六個不同的地方可以儲存資料: 1. 暫存器(register)。 這是最快的儲存區,因為它

備份校驗兩不誤MySQL自動備份還原校驗設計

作者介紹 龐闊,優朋普樂傳媒運維基礎部經理。負責資料庫運營管理及平臺設計開發,監控設計改進,問題跟蹤處理,機房網路維護管理,目前四個專利已在專利局申請中。擅長資料庫運維管理及Shell、Perl、PHP編寫。 背景 最近關於資料庫故障出現的問題較多,不論大小公司對資料的備份要求都很高,但對校驗資料備