1. 程式人生 > >原始碼專題之spring設計模式:委派模式、工廠模式

原始碼專題之spring設計模式:委派模式、工廠模式

委派模式

在常見的23種設計模式中其實並沒有委派模式的影子,但是委派模式確實是spring中應用比較多的一種,SpringMVC框架中的DispatcherServlet就是用到了這種模式。下面以專案經理和普通員工的模型來實現一個簡單的委派模式。

1.公司員工,包括專案經理和普通員工

public interface IExector {
    void working;
}

2.定義兩個普通員工A和B(任務執行類)

public class WorkerA implements IExector {
    public void working() {
        System.out.println("員工A執行任務");
    }
}
---
public class WorkerB implements IExector {
    public void working() {
        System.out.println("員工B執行任務");
    }
}

3.定義專案經理(任務分發類)

public class Dispatcher implements IExector {
    private IExector iExector;
    
    public void working() {
        //專案經理的任務是分發任務
        this.iExector.working();
    }
}

工廠模式

以生產汽車為例,先定義三個型別的汽車:

public interface Car {
    String getName();    
}
---
public class Audi implements Car{
    @Override
    public String getName() {
        return "Audi";
    }
}
---
public class Benz implements Car{
    @Override
    public String getName() {
        return "Benz";
    }
}
---
public class Bmw implements Car{
    @Override
    public String getName() {
        return "BMW";
    }
}

1.簡單工廠模式

示例程式碼:

public class SimpleFactory {
    public static Car getCar(String name){
        if("BMW".equalsIgnoreCase(name)){
            return new Bmw();
        }else if("Benz".equalsIgnoreCase(name)){
            return new Benz();
        }else if("Audi".equalsIgnoreCase(name)){
            return new Audi();
        }else{
            System.out.println("這個產品產不出來");
            return null;
        }
    }
    
}

特點:

  • 它是一個具體的類,非介面抽象類。有一個重要的getCar()方法,利用if或者 switch建立產品並返回。
  • getCar()方法通常是靜態的,所以稱之為靜態工廠

缺點:

  • 擴充套件性差(我想增加一種汽車,除了新增一個汽車產品類,還需要修改工廠類方法)
  • 不同的產品需要不同額外引數的時候不支援。

2.工廠方法模式

模式描述:

提供一個用於建立物件的介面(工廠介面),讓其實現類(工廠實現類)決定例項化哪一個類(產品類),並且由該實現類建立對應類的例項。

模式作用:

可以一定程度上解耦,消費者和產品實現類隔離開,只依賴產品介面(抽象產品),產品實現類如何改動與消費者完全無關。

可以一定程度增加擴充套件性,若增加一個產品實現,只需要實現產品介面,修改工廠建立產品的方法,消費者可以無感知(若消費者不關心具體產品是什麼的情況)。
可以一定程度增加程式碼的封裝性、可讀性。清楚的程式碼結構,對於消費者來說很少的程式碼量就可以完成很多工作。
等等。
另外,抽象工廠才是實際意義的工廠模式,工廠方法只是抽象工廠的一個比較常見的情況。

適用場景:

消費者不關心它所要建立物件的類(產品類)的時候。
消費者知道它所要建立物件的類(產品類),但不關心如何建立的時候,等等。例如:hibernate裡通過sessionFactory建立session、通過代理方式生成ws客戶端時,通過工廠構建報文中格式化資料的物件。

模式要素:

提供一個產品類的介面。產品類均要實現這個介面(也可以是abstract類,即抽象產品)。
提供一個工廠類的介面。工廠類均要實現這個介面(即抽象工廠)。
由工廠實現類建立產品類的例項。工廠實現類應有一個方法,用來例項化產品類。

示例程式碼:

public abstract class AbstractFactory {
     protected abstract Car getCar();
     //這段程式碼就是動態配置的功能
     //固定模式的委派
     public Car getCar(String name){
        if("BMW".equalsIgnoreCase(name)){
            return new BmwFactory().getCar();
        }else if("Benz".equalsIgnoreCase(name)){
            return new BenzFactory().getCar();
        }else if("Audi".equalsIgnoreCase(name)){
            return new AudiFactory().getCar();
        }else{
            return new DefaultFactory().getCar();
        }
    }
}
---
public class DefaultFactory extends AbstractFactory {
    private AudiFactory defaultFactory = new AudiFactory();
    public Car getCar() {
        return defaultFactory.getCar();
    }
}
---
public class AudiFactory extends AbstractFactory {
    @Override
    public Car getCar() {
        return new Audi();
    }
}

3.抽象工廠模式

定義:為建立一組相關或相互依賴的物件提供一個介面,而且無需指定他們的具體類。

類圖:

image

抽象工廠模式與工廠方法模式的區別:

抽象工廠模式是工廠方法模式的升級版本,他用來建立一組相關或者相互依賴的物件。他與工廠方法模式的區別就在於,工廠方法模式針對的是一個產品等級結構;而抽象工廠模式則是針對的多個產品等級結構。在程式設計中,通常一個產品結構,表現為一個介面或者抽象類,也就是說,工廠方法模式提供的所有產品都是衍生自同一個介面或抽象類,而抽象工廠模式所提供的產品則是衍生自不同的介面或抽象類。

在抽象工廠模式中,有一個產品族的概念:所謂的產品族,是指位於不同產品等級結構中功能相關聯的產品組成的家族。抽象工廠模式所提供的一系列產品就組成一個產品族;而工廠方法提供的一系列產品稱為一個等級結構。我們依然拿生產汽車的例子來說明他們之間的區別。

相關推薦

原始碼專題spring設計模式委派模式工廠模式

委派模式 在常見的23種設計模式中其實並沒有委派模式的影子,但是委派模式確實是spring中應用比較多的一種,SpringMVC框架中的DispatcherServlet就是用到了這種模式。下面以專案經理和普通員工的模型來實現一個簡單的委派模式。 1.公司員工,包括專案經理和普通員工 public in

原始碼專題spring設計模式jdk動態代理

jdk動態代理 程式碼實現  滿足代理模式應用場景的三個必要條件 兩個角色:執行者、被代理物件 注重過程,必須要做,被代理物件沒時間做或者不想做(怕羞羞),不專業 執行者必須拿到被代理物件的個人資料(執行者持有被代理物件的引用) jdk的動態代理通過呼叫Proxy.n

原始碼專題spring設計模式

jdk動態代理 jdk動態代理 程式碼實現 滿足代理模式應用場景的三個必要條件 兩個角色:執行者、被代理物件 注重過程,必須要做,被代理物件沒時間做或者不想做(怕羞羞),不專業 執行者必須拿到被代理物件的個人資料(執行者持有被代理物件的引用) jdk的動態代理通過呼叫Proxy.newProxyI

Spring中常用的設計模式委派模式

Spring MVC框架中的DispatcherServlet其實就用了委派模式,也有人稱為是代理模式和策略模式的組合。 代理模式 使用代理物件來執行目標物件的方法並在代理物件中增強目標物件方法。 策略模式 策略模式是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的

Spring原始碼解析 Spring Security啟動細節和工作模式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

PHP模式設計單例模式工廠模式註冊樹模式適配器模式觀察者模式

操作符 unset 關系 玩具 ati ase color 只有一個 bsp php模式設計之單例模式   什麽是單例模式?   單例模式是指在整個應用中只有一個實例對象的設計模式   為什麽要用單例模式?   php經常要鏈接數據庫,如果在一個項目中頻繁建立連接數據庫,會

設計模式學習筆記(11)——外觀模式

職責 div 再看 style 假設 str 改變 復雜 並且 設計模式:學習筆記(11)——外觀模式 引入外觀模式 什麽是外觀模式   外觀模式(Facade Pattern)隱藏系統的復雜性,並向客戶端提供了一個客戶端可以訪問系統的接口。這種類型的設計模式屬於結構型模式

設計模式訪問者(Visitor)模式

tlist 情況下 面向 font ati pap 書籍 技術 原理 設計模式:訪問者(Visitor)模式 一、前言 什麽叫做訪問,如果大家學過數據結構,對於這點就很清晰了,遍歷就是訪問的一般形式,單獨讀取一個元素進行相應的處理也叫作訪問,讀取到想要查看的內容+對其

設計模式外觀(Facade)模式

text 一起 其它 QQ 如何 互調 IT 抽象 整合 設計模式:外觀(Facade)模式 一、前言 外觀模式是一種非常簡單的模式,簡單到我們經常都會使用,比如對於類A和B,如果兩者需要交互,經過一定的處理過程才能實現某一個具體的功能,那麽我們可以將這個處理的過程定義

設計模式命令(Command)模式

box exe see 再次 clas sed hist 本質 private 設計模式:命令(Command)模式 一、前言 命令也是類,將命令作為一個類來保存,當要使用的時候可以直接拿來使用,比如腳本語言寫出的腳本,只需要一個命令就能執行得到我們想要的需要操作很長時

spring-data詳解spring-data-jpa簡單三步快速上手spring-data-jpa開發

事務管理 out don 前言 map lns xid public lease 前言: 基於spring framework 4.x或spring boot 1.x開發環境 務必註意以下版本問題:Spring framework4.x(Spring boot1.x)對應s

多線程設計模式第五篇 - Future模式和兩階段終止模式

捕獲 數量 如果 data counter 分享 就是 main 多次 一,Future模式 ????????Future 的意思是未來,假設有一個方法需要花費很長的時間才能獲取運行結果,那麽與其一直等待,不如先拿到一份最終數據的模板,即 Future 角色,等過一陣子再通

Java程式設計師從笨鳥到菜鳥(三十二)大話設計模式(二)設計模式分類和三種工廠模式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java中的設計模式單例模式工廠模式

Java中的設計模式            轉載地址:https://www.toutiao.com/i6573486403282272775/ 為什麼要學習設計模式 1)設計模式都是一些相對優秀的解決方案,很多問題都是典型的

python設計模式鏈式建造者模式

class Pizza: def __init__(self, builder): self.garlic = builder.garlic self.extra_cheese = builder.extra_cheese def __str__(self): garl

Spring5原始碼分析Spring

前言 因為本人打算仿照Spring寫個小型Spring–TinySpring,所以要閱讀Spring原始碼,在閱讀原始碼過程中的發現就記錄於此,如果有什麼錯誤,歡迎指出,我會及時更正。 正文 Disp

Spring原始碼解讀Spring MVC HandlerMapping元件(二)

一、HandlerMapping HandlerMapping作用是根據request找到相應的處理器Handler和Interceptors,並將Handler和Interceptors封裝成HandlerExecutionChain 物件返回。Handler

設計模式學習筆記(12)——代理模式

設計模式:學習筆記(12)——代理模式 代理模式   挾天子以令諸侯,曹操與漢獻帝的關係,映射了代理模式的。所謂代理者是指一個類別可以作為其他東西的介面。代理者使用代理物件完成使用者請求,遮蔽使用者對真實物件的訪問。在軟體設計中,使用代理模式的意圖有很多,比如因為安全原因需要遮蔽客戶端直接訪問真實物件,或

【死磕 Spring】—– IOC 解析 bean 標籤constructor-argproperty 子元素

上篇部落格(【死磕 Spring】—– IOC 之解析 bean 標籤:meta、lookup-method、replace-method)分析了 meta 、 lookup-method、replace-method 三個子元素,這篇部落格分析 constr

Jetty原始碼分析執行緒池QueuedThreadPool

前面分析Jetty整體架構的時候介紹過Jetty的三大元件:Acceptor、Handler和ThreadPool;前兩者工作的時候都是需要執行緒的,而所需的執行緒正是從ThreadPool中獲取的。這篇檔案就是來分析ThreadPool的一個具體實現:Queu