1. 程式人生 > >設計模式之六大原則 以及 簡單工廠模式

設計模式之六大原則 以及 簡單工廠模式

      作為一個合格的程式設計師所寫出來的程式是要具有靈活性的,就是寫的程式碼,要維護性高,複用性高,擴充套件性高。通過面向物件的特點(封裝,繼承,多型...)把程式的耦合度降低,使其達到高內聚,低耦合。那麼在有些時候使用適當的設計模式可以使得程式更加的靈活,易於修改,易於複用。

設計模式的六大原則

一、單一職責原則

該原則是指一個類只負責一個功能領域中的相應職責,或者可以定義為:就一個類而言,應該只有一個引起它變化的原因。它是實現高內聚、低耦合的指導方針,它是最簡單但又最難運用的原則,需要設計人員發現類的不同職責並將其分離,而發現類的多重職責需要設計人員具有較強的分析設計能力和相關實踐經驗。

二、開閉原則

該原則是面向物件的可複用設計的第一塊基石,它是最重要的面向物件設計原則。一個軟體實體應當對擴充套件開放,對修改關閉。即軟體實體應儘量在不修改原有程式碼的情況下進行擴充套件,軟體實體可以指一個軟體模組、一個由多個類組成的區域性結構或一個獨立的類。

三、里氏替換原則

該原則是指所有引用基類(父類)的地方必須能透明地使用其子類的物件。在軟體中將一個基類物件替換成它的子類物件,程式將不會產生任何錯誤和異常,反過來則不成立,如果一個軟體實體使用的是一個子類物件的話,那麼它不一定能夠使用基類物件。

四、依賴倒置原則

抽象不應該依賴於細節,細節應當依賴於抽象。換言之,要針對介面程式設計,而不是針對實現程式設計。
在實現依賴倒轉原則時,我們需要針對抽象層程式設計,而將具體類的物件通過依賴注入(DI)

的方式注入到其他物件中,依賴注入是指當一個物件要與其他物件發生依賴關係時,通過抽象來注入所依賴的物件。常用的注入方式有三種,分別是:構造注入,設值注入(Setter注入)和介面注入。構造注入是指通過建構函式來傳入具體類的物件,設值注入是指通過Setter方法來傳入具體類的物件,而介面注入是指通過在介面中宣告的業務方法來傳入具體類的物件。這些方法在定義時使用的是抽象型別,在執行時再傳入具體型別的物件,由子類物件來覆蓋父類物件。

五、介面隔離原則

使用多個專門的介面,而不使用單一的總介面,即客戶端不應該依賴那些它不需要的介面。
在使用介面隔離原則時,我們需要注意控制介面的粒度,介面不能太小,如果太小會導致系統中介面氾濫,不利於維護;介面也不能太大,太大的介面將違背介面隔離原則,靈活性較差,使用起來很不方便。一般而言,介面中僅包含為某一類使用者定製的方法即可,不應該強迫客戶依賴於那些它們不用的方法。


六、迪米特法則

一個軟體實體應當儘可能少地與其他實體發生相互作用。迪米特法則可降低系統的耦合度,使類與類之間保持鬆散的耦合關係。迪米特法則要求我們在設計系統時,應該儘量減少物件之間的互動,如果兩個物件之間不必彼此直接通訊,那麼這兩個物件就不應當發生任何直接的相互作用,如果其中的一個物件需要呼叫另一個物件的某一個方法的話,可以通過第三者轉發這個呼叫。簡言之,就是通過引入一個合理的第三者來降低現有物件之間的耦合度

在將迪米特法則運用到系統設計中時,要注意下面的幾點:

1)在類的劃分上,應當儘量建立鬆耦合的類,類之間的耦合度越低,就越有利於複用,一個處在鬆耦合中的類一旦被修改,不會對關聯的類造成太大波及;

2)在類的結構設計上,每一個類都應當儘量降低其成員變數和成員函式的訪問許可權;

3)在類的設計上,只要有可能,一個型別應當設計成不變類;在對其他類的引用上,一個物件對其他物件的引用應當降到最低。

簡單工廠模式

現在我們有一個要做計算器需求,要求實現加減乘除的演算法,用簡單工廠模式就如下:

類圖:


1、新建一個Operation類

public class Operation {
    private double NumberA;
    private double NumberB;
    public Operation() {
        NumberA = 0.00;
NumberB = 0.00;
}

    public double getNumberA() {
        return NumberA;
}

    public void setNumberA(double numberA) {
        NumberA = numberA;
}

    public double getNumberB() {
        return NumberB;
}

    public void setNumberB(double numberB) {
        NumberB = numberB;
}

    public double getResult(double NumberA,double NumberB) throws Exception {

        double result = 0.0;
        return result;
}
}

2、分別新建加、減、乘、除的類來繼承這個Operation父類

1)加法:

public class OperationAdd extends Operation {
    /**
     * 加法
*/
@Override
public double getResult(double NumberA,double NumberB) {
        double result = NumberA + NumberB;
        return result;
}
}

2)減法:

public class OperationSub extends Operation {
    /**
     * 減法
*/
@Override
public double getResult(double NumberA, double NumberB) {
        double result = NumberA - NumberB;
        return result;
}
}

3)乘法:

public class OperationMul extends Operation {
    /**
     * 乘法
*/
@Override
public double getResult(double NumberA, double NumberB) {
        double result = NumberA * NumberB;
        return result;
}
}

4)除法:

public class OperationDiv extends Operation {
    /**
     * 除法
*/
@Override
public double getResult(double NumberA, double NumberB) throws Exception {

        if (NumberB == 0) {
            throw new Exception("除數不能為0");
}

        double result = NumberA / NumberB;
        return result;
}
}

3、新建一個運算工廠類在實現這個運算

public class OperationFactory {
    public static Operation createOperation(String operate) {

        Operation ope = null;
        switch (operate) {
            case "+":
                ope = new OperationAdd();
                break;
            case "-":
                ope = new OperationSub();
                break;
            case "*":
                ope = new OperationMul();
                break;
            case "/":
                ope = new OperationDiv();
                break;
}
        return ope;
}
}

4、執行

public class Run {

    public static void main(String[] args) throws Exception{

        Operation operation = OperationFactory.createOperation("-");
        double NumberA = 1;
        double NumberB = 2;
        double result = operation.getResult(NumberA,NumberB);
System.out.println(result);
}
}

 簡單工廠模式的優點:

 模組清晰化,每個部分都各司其職,分工明確。

缺點:

如果此時需要增加一產品,比如在計算器中加入一個新的功能,可以求M的N次方,這樣個小功能我們就要去新增一個新的類,同時我們需要在Factory中改動到switch裡面的程式碼,這是耦合性很高的表現。

相關推薦

設計模式六大原則 以及 簡單工廠模式

      作為一個合格的程式設計師所寫出來的程式是要具有靈活性的,就是寫的程式碼,要維護性高,複用性高,擴充套件性高。通過面向物件的特點(封裝,繼承,多型...)把程式的耦合度降低,使其達到高內聚,低耦合。那麼在有些時候使用適當的設計模式可以使得程式更加的靈活,易於修改,易

設計模式六大原則

讓其 目的 接口 其他 迪米特 裏氏替換原則 容易 父類 設計 一、單一原則 單一原則是指每個類只負責單一的功能。不能太復雜。並盡量把功能做到極致。 二、裏氏替換原則     一個子類應該可以替換一個父類。並且可以正常工作。 三、接口隔離原則

設計模式六大原則(轉載)

具體類 ima 傳遞參數 基礎上 比較 擁有 tex 至少 基類 關於設計模式的六大設計原則的資料網上很多,但是很多地方解釋地都太過於籠統化,我也找了很多資料來看,發現CSDN上有幾篇關於設計模式的六大原則講述的比較通俗易懂,因此轉載過來。   原作者博客鏈接:http:/

易學設計模式看書筆記(2) - 簡單工廠模式

原理 pub -m post 繼承 void cto tracking else if 本文摘自易學設計模式一書 一、簡單工廠模式 1.動物管理系統的樣例 public interface Animal{ public void eat(); } publi

Java 設計模式(一):簡單工廠模式

參考連結:簡單工廠模式-Simple Factory Pattern 1. 模式概述 定義:定義一個工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。因為在簡單工廠模式中用於建立例項的方法是靜態方法,因此簡單工廠模式又被稱為靜態工廠方法模式。 簡

設計模式(一)從“簡單工廠模式”升級為“工廠方法模式

工廠模式的引入是為了管理物件的構造,對使用者遮蔽構造過程,使用者只從工廠拿取新物件。 簡單工廠模式 用一個場景介紹簡單工廠模式:某工廠想包攬所有產品生產,不僅提供很多不同型別的產品(iPhone 5,6,7...),還時不時生產新型別的產品(三星S8),而且客戶不關係產品

設計模式】(一)-簡單工廠模式和策略模式

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

設計模式禪》-5.抽象工廠模式

抽象工廠模式 定義: 為建立一組相關或相互依賴的物件提供一個介面,而且無需指定它們的具體類 抽象產品類 public abstract class AbstractProductA { //每個產品的共有方法 public void shareMethod () {

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

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

設計模式】【四】簡單工廠模式

相關文章 1.簡單工廠模式簡介 定義 簡單工廠模式屬於建立型模式又叫做靜態工廠方法模式,是由一個工廠物件決定創建出哪一種產品類的例項。 簡單工廠模式結構圖 Factory:工廠類,簡單工廠模式的核心,它負責實現建立所有例項的內部邏輯。

設計模式(Java語言)- 簡單工廠模式

  簡單工廠模式有稱為靜態工廠模式,屬於設計模式中的建立型模式。簡單工廠模式通過對外提供一個靜態方法來統一為類建立例項。簡單工廠模式的目的是實現類與類之間解耦,其次是客戶端不需要知道這個物件是如何被穿創建出來的,只需要呼叫簡單工廠模式的方法來統一建立就可以了,從而明確了各個類的職責。   一、建立簡單工廠模式

大話設計模式四:1~5章(簡單工廠模式 、策略模式、單一職責原則、開放封閉原則 、依賴倒轉原則

注:《大話設計模式》這本書很好的介紹了設計模式,其對應的原始碼是C#語言寫得,跑在visual studio上,所以自己先安裝visual studio ,然後將原始碼跑一跑,這樣能深刻的理解《大話設

設計模式策略模式&簡單工廠模式

抽象 jsb args watermark amp pri eas 時間 並且 學習設計模式已經有非常長一段時間了。事實上先前已經敲過一遍了,可是老認為沒有學到什麽,認識也不夠深刻,如今趁著重構機房。再又一次來過,也不晚。 事實上在敲了機房之後,看看模式,事實

設計模式 簡單工廠模式詳解

技術分享 接口 create [] 幫助 cut 小蘿莉 filter 類之間的關系 定義:從設計模式的類型上來說,簡單工廠模式是屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠

(原創)我眼中的設計模式系列簡單工廠模式(一)

int 業務 text 們的 acc 現在 rgs sub reat 簡單工廠模式   在日常的軟件開發中,我們一般都是按照模塊來劃分工作的。 場景一:   試想我們現在有這麽一個模塊,為其他的模塊提供服務,比如說我們調用了好幾個外部接口,統一返回XML字符串,每個接口返回

Asp.Net 設計模式 簡單工廠模式

相關 如果 cnblogs 獲取 自動 ber c# thread operation 主要思想:      public static Operation CreateFactory(string ope) { //實例化空父類,讓

C#設計模式創建類模式簡單工廠模式

div main bst http fin 想要 對象 sqlserver 關鍵字 這是記錄設計模式種的創建型模式的第一篇,所以,在開頭要說一些關於創建型模式的含義和意義。 創建型模式 軟件系統在運行時,類將被實例化成對象,並由這些被創建的對象協作完成系統中要求的各項業務功

設計模式簡單工廠模式

pos 示例 概念 font 代碼示例 情況 strong size span 概念    應用場景   一個類多個子類,也就是多態的情況,當我們 代碼示例設計模式之簡單工廠模式

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

們的 設置 inpu ride args forname property 簡單 是不是 簡介:工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。 在工廠模式中,我們在創建對象

php設計模式六大設計原則

更多 設計原則 其他 使用 重載 以及 陌生人 模式 blog 1.單一職責 定義:不要存在多於一個導致類變更的原因。通俗的說,即一個類只負責一項職責。 場景:類T負責兩個不同的職責:職責P1,職責P2。當由於職責P1需求發生改變而需要修改類T時