GOF23之工廠模式

一、核心作用:

實現了創建者和調用者分離

二、面向對象的基本原則:

1、OCP開閉原則(open-closed principle):一個軟件的實體應當對擴展開放,對修改關閉。
2、DIP依賴倒轉原則(Dependence Inversion principle):要針對接口編程,不要針對實現編程
3、Lod迪米特法則(Low of Demeter/Demeter Principle):只與直接朋友通信,避免和陌生人通信
4、ISP接口隔離原則(Interface Segregation Principle):使用多個隔離的接口,比單個接口要好,降低依賴,降低耦合
5、CRP合成複用原則(Composite Reuse Principle):儘可能使用合成/聚合的方式,而不是使用進程
6、LSP里氏代換原則(Liskov Substitution Principle):任何基類可以出現的地方,子類一定可以出現LSP是繼承複用的基石,只有當衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正的被複用,而衍生類也能再基類的基礎上加新的行爲。里氏代換原則是對”開閉原則“的補充

三、優點:

1、實例化對象,用工廠方法代替new操作
2、將選擇實現類、創建對象統一管理和控制,實現調用者與實現類解耦

四、工廠模式實現方式:

簡單工廠模式:用來生產同一等級結構的任意產品(增加新產品需修改原代碼)
工廠方法模式:用來生產同一等級結構中的固定產品(支持增加任意產品)
抽象工廠模式:用來生產不同產品族的全部產品(對於增加新的產品,無能爲力)

一、簡單工廠(SimpleFactory)

在這裏插入圖片描述


package com.hezeu.factory.simplefactory;

/**
*@Classname  CarFactory
*@Description  工廠實現new
*@Date  2020/2/20  下午  04:41
*@Created  by  朱進博  [email protected]
*/
public class CarFactory{
	public static CarcreateAudi(){
		return new Audi();
	}

	public static CarcreateByd(){
		return new Byd();
	}
}


package com.hezeu.factory.simplefactory;

/**
*@Classname  CarFactory02
*@Description  TODO
*@Date  2020/2/20  下午  04:42
*@Created  by  朱進博  [email protected]
*/
public class CarFactory02{
	public static CarcreateCar(Stringtype){
		if(type.equals("奧迪")){
			return new Audi();
		}else if(type.equals("比亞迪")){
			return new Byd();
		}else{
			return null;
		}
	}
}

優點:簡單工廠模式也叫靜態工廠模式,工廠類使用靜態方法,通過接受參數返回不同的對象實例
問題:對於增加新產品無能威力,需要修改代碼,無法滿足OCP開閉原則

二、工廠方法模式(FactoryMethod)

在這裏插入圖片描述
工廠類:

packagecom.hezeu.factory.factorymethod;

/**
*@Classname AudiFactory
*@Description TODO
*@Date 2020/2/20 下午 05:14
*@Created by 朱進博 [email protected]
*/
public class AudiFactory implements CarFactory{
	@Override
	public Car createCar(){
		return new Audi();
	}
}

測試類:

package com.hezeu.factory.factorymethod;

/**
*@Classname  Client
*@Description  TODO
*@Date  2020/2/20  下午05:16
*@Created  by  朱進博  [email protected]
*/
public class Client{

	public static void main(String[]args){
		Car c1 = new AudiFactory().createCar();

		Car c2 = new BydFactory().createCar();

		c1.run();
		c2.run();
	}
}

優點:解決了簡單工廠模式中的缺點,滿足OCP開閉原則
缺點:需要創建多個類文件,結構複雜、管理複雜

簡單工廠模式與工廠方法模式對比:
結構複雜度對比:

簡單工廠模式:只需創建一個工廠類
工廠方法模式:工廠類隨着產品類的個數增加

代碼複雜度對比:

簡單工廠模式:因只有一個工廠類,雖結構簡潔,但代碼複雜
工廠方法模式:每個具體工廠類只完成單一任務,代碼簡潔

客戶端編程難度對比:

簡單工廠模式:工廠類爲靜態類,只需調用方法,無需實例化對象
工廠方法模式:雖滿足了OCP開閉原則,但客戶端編程需要對工廠類逐一實例化

管理難度對比:

簡單工廠模式:未滿足OCP開閉原則,但如果產品類需要修改時,僅需修改唯一的工具類,管理簡單。
工廠方法模式:工廠方法模式滿足OCP,擴展性較強,但如果設計多個產品類的時候,對於工廠類的修改將會非常麻煩,管理複雜。

三、抽象工廠模式(產品族管理)

在這裏插入圖片描述

優點:用來生產不同產品族的全部產品,有利於產品一致性,降低了模塊見的耦合性,提高了團隊效率
缺點:對於增加新產品無能爲力

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