Java 设计模式之工厂模式(二)
原文地址:Java 設計模式之工廠模式(二)
博客地址:http://www.extlight.com
一、背景
本篇內容是 Java 設計模式創建型模式的第二篇。上一篇主題為 《Java 設計模式之單例模式(一)》
二、簡單介紹
在介紹工廠模式之前,我們需要了解設計模式中應該遵循的原則。
五大原則:
1) 單一職責原則(SRP):就一個類而言,應該僅有一個引起它變化的原因。即一個類中應該只有一類邏輯。
2) 開放-封閉原則(OCP):軟件實體(類、模塊、函數等等)應該可以擴展,但是不可修改。即開放擴展,封閉修改。
3) 依賴倒轉原則(DIP):高層模塊不應該依賴底層模塊。兩個都應該依賴抽象;抽象不應該依賴細節。細節應該依賴抽象。即面向接口編程,而不是面向實現編程。
4) 里氏代換原則(LSP):子類型必須能夠替換掉他們的父類型。
5) 合成/聚合復用原則(CARP):盡量使用合成/聚合,盡量不要使用類繼承。
迪米特法則:如果兩個類不必彼此直接通信,那么這兩個類就不應當發生直接的相互作用。如果其中一個類需要調用另一個類的某一方法的話,可以通過第三者轉發這個調用
三、實現方式
工廠模式有 3 種:簡單工廠模式、工廠方法模式和抽象工廠模式。
本篇文章只講解簡單工廠模式、工廠方法模式。因為簡單工廠模式和工廠方法模式是針對單獨一類產品的創建方式,而抽象工廠模式是針對產品族考慮。
我們以創建轎車為例,未使用工廠模式:
public abstract class Car {public abstract void run(); }public class Benz extends Car {@Overridepublic void run() {System.out.println("開奔馳");}}public class Bmw extends Car{@Overridepublic void run() {System.out.println("開寶馬");}}public class Client {public static void main(String[] args) {Car car1 = new Benz();car1.run();Car car2 = new Bmw();car2.run();} }在 Client 類中既有創建對象邏輯又有調用方法邏輯,且與多個類發生耦合。違背了單一職責原則和迪米特法則。
UML 類圖表示如下:
3.1 簡單工廠模式
簡單工廠模式屬于類的創建型模式,又叫做靜態工廠方法模式。通過專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
工廠類:
public class CarFactory {public static Car createCar(String type) {Car car = null;switch (type) {case "benz":car = new Benz();break;case "bmw":car = new Bmw();break;}return car;} }客戶端調用:
public class Client {public static void main(String[] args) {Car car1 = CarFactory.createCar("benz");car1.run();Car car2 = CarFactory.createCar("bmw");car2.run();} }總結:Client 類與 Car 的子類解耦,它不需要知道 Car 實例具體創建細節,只需要通知工廠類需要怎樣的實例。這樣,減少了與外部類(Car 的子類)的通信,遵循了迪米特法則。
UML 類圖表示如下:
3.2 工廠方法模式
簡單工廠模式設計和使用非常簡單。當我們需要新品牌的車子(如:奧迪)時,只需要在 CarFactory 的靜態方法中添加一個判斷即可。但是,這種寫法違背了開放封閉原則,我們在編碼是盡量不要修改業務代碼。
為了解決這一問題,我們可以使用工廠方法模式。
工廠方法模式同樣屬于類的創建型模式又被稱為多態工廠模式。工廠方法模式的意義是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。
創建父類工廠:
public interface CarFactory {Car createCar(); }工廠實現類:
public class BenzFactory implements CarFactory {@Overridepublic Car createCar() {return new Benz();}}public class BmwFactory implements CarFactory {@Overridepublic Car createCar() {return new Bmw();}}客戶端調用:
public class Client {public static void main(String[] args) {CarFactory cf1 = new BenzFactory();Car car1 = cf1.createCar();car1.run();CarFactory cf2 = new BmwFactory();Car car2 = cf2.createCar();car2.run();} }當我們需要添加奧迪車時,創建 Audi 實體類繼承 Car 和 AudiFactory 工廠類去實現 CarFactory 接口方法即可。
總結:不用修改業務代碼,只需創建新的類即可實現功能擴展,遵循了開放封閉原則。但是,Client 類中出現創建對象邏輯,違背責任單一原則。每新增一類產品就需要創建 N 個類文件,增加項目結構的復雜度。
UML 類圖表示如下:
轉載于:https://www.cnblogs.com/moonlightL/p/7798124.html
總結
以上是生活随笔為你收集整理的Java 设计模式之工厂模式(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OSGI是什么
- 下一篇: 根据实践经验,讲述些学习Java web