1. 程式人生 > >Java23種設計模式

Java23種設計模式

生產 抽象工廠模式 com void 適配 依賴倒轉 mman rgs ati

一、設計模式的分類

分類 設計模式
創建型

工廠方法模式(Factory Method)、抽象工廠模式(Abstract Factory)、
建造者模式(Builder)、原型模式(Prototype)、單例模式(Singleton)

結構型

適配器模式(Adapter)、橋接模式(Bridge)、組合模式(Composite)、
裝飾器模式(Decorator)、門面模式(Facade)、享元模式(Flyweight)、
代理模式(Proxy)

行為型

解釋器模式(Interpreter)、模板方法模式(Template Method)、
責任鏈模式(Chain of Responsibility)、命令模式(Command)、
叠代器模式(Iterator)、調解者模式(Mediator)、備忘錄模式(Memento)、
觀察者模式(Observer)、狀態模式(State)、策略模式(Strategy)、
訪問者模式(Visitor)

二、設計模式的原則

1、開閉原則(Open Close Principle)

開閉原則就是說對擴展開放,對修改關閉。在程序需要進行拓展的時候,不能去修改原有的代碼,實現
一個熱插拔的效果。所以一句話概括就是:為了使程序的擴展性好,易於維護和升級。想要達到這樣的
效果,我們需要使用接口和抽象類,後面的具體設計中我們會提到這點。

2、裏氏替換原則(Liskov Substitution Principle)

裏氏代換原則(Liskov Substitution Principle LSP)面向對象設計的基本原則之一。 裏氏代換原則中說,任何基類可以出現的地方,子類一定可以出現。 LSP是繼承復用的基石,只有當衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為。裏氏代換原則是對“開-閉”原則的補充。實現“開-閉”原則的關鍵步驟就是抽象化。而基類與子類的繼承關系就是抽象化的具體實現,所以裏氏代換原則是對實現抽象化的具體步驟的規範。—— From Baidu 百科

歷史替換原則中,子類對父類的方法盡量不要重寫和重載。因為父類代表了定義好的結構,通過這個規範的接口與外界交互,子類不應該隨便破壞它。

3、依賴倒轉原則(Dependence Inversion Principle)

這個是開閉原則的基礎,具體內容:面向接口編程,依賴於抽象而不依賴於具體。寫代碼時用到具體類時,不與具體類交互,而與具體類的上層接口交互。

4、接口隔離原則(Interface Segregation Principle)

這個原則的意思是:每個接口中不存在子類用不到卻必須實現的方法,如果不然,就要將接口拆分。使用多個隔離的接口,比使用單個接口(多個接口方法集合到一個的接口)要好。

5、迪米特法則(最少知道原則)(Demeter Principle)

就是說:一個類對自己依賴的類知道的越少越好。也就是說無論被依賴的類多麽復雜,都應該將邏輯封裝在方法的內部,通過public方法提供給外部。這樣當被依賴的類變化時,才能最小的影響該類。

最少知道原則的另一個表達方式是:只與直接的朋友通信。類之間只要有耦合關系,就叫朋友關系。耦合分為依賴、關聯、聚合、組合等。我們稱出現為成員變量、方法參數、方法返回值中的類為直接朋友。局部變量、臨時變量則不是直接的朋友。我們要求陌生的類不要作為局部變量出現在類中。

6、合成復用原則(Composite Reuse Principle)

原則是盡量首先使用合成/聚合的方式,而不是使用繼承。

三、23種設計模式

3.1、簡單工廠模式,

簡單工廠模式又叫靜態工廠模式,簡單工廠模式不屬於23中常用的設計模式,簡單工廠模式的應用場景,是由一個工廠類根據實際傳入的參數,動態的決定應該創建哪一個產品類

實例:我們生活中買到的牛奶,牛奶的品種有很多種,比如蒙牛,伊利,都是由牛奶廠生產出來的,下面進行模擬

①:創建伊利,蒙牛二者的共同接口

public interface Milk {
    public String getMilk(String name);
}

②:創建伊利產品類,實現Milk

public class YiLi implements Milk {
    @Override
    public String getMilkName(String name) {
        return "伊利";
    }
}

③:創建MengNiu,實現Milk

public class MengNiu implements Milk {
    @Override
    public String getMilkName(String name) {
        return "蒙牛";
    }
}

④:創建牛奶工廠,MilkFactory

public class MilkFactory{
    public  Milk produceMilk(String name){
        if(name.equals("伊利")){
            return new YiLi();
        }else if(name.equals("蒙牛")){
            return  new MengNiu();
        }else{
            System.out.println("無法生產");
            return null;
        }
    }
}

⑤:創建測試類

public class MilkFactoryTest{
    public static void main(String[] args) {
        MilkFactory milkFactory=new MilkFactory();
        System.out.println(milkFactory.produceMilk("伊利"));
    }
}

註:想要生產牛奶,必須知道牛奶的品牌,如果傳入的參數有誤,則不能進行生產,修改MilkFactory

public class MilkFactory{
    public Milk produceMengNiu(){
        return new MengNiu();
    }
    public Milk  produceYiLi(){
        return new YiLi();
    }     
}

修改測試類:

public class MilkFactoryTest {
    public static void main(String[] args) {
   //如果不想創建對象,則可以將MilkFactory的方法修改為靜態方法 
MilkFactory milkFactory
=new MiilkFactory(); milkFactory.produceMengNiu(); } }

3.2、工廠模式  

通常由應用程序直接使用 new 創建新的對象,為了將對象的創建和使用相分離,采用工廠模式,即應用程序將對象的創建及初始化職責交給工廠對象

實例:對上面簡單工廠方法的實例進行修改,保持MIlk ,MengNiu,YiLi不變,修改MilkFactory

public interface MilkFctory{
    public Milk produceMilk();
}

①:創建MengNiuFactory,實現MilkFactory,生產蒙牛產品

public class MengNiuFactory implements MilkFactory {
    @Override
    public Milk produceMilk() {
        return new MengNiu();
    }
}

②:創建YiLiFactory,實現MilkFactory,生產伊利產品

public class YiLiFactory implements MilkFactory {
    @Override
    public Milk produceMilk() {
        return new YiLi();
    }
}

③:創建測試類

public class FactoryTest {
    public static void main(String[] args) {  
  //    MilkFactory mengNiuFactory=new MengNiuFactory();
        MilkFactory yiLiFactory=new YiLiFactory();
        System.out.println(yiLiFactory.produceMilk());
    }
}

註:如果在想添加一個產品比如安慕希,則只需要實現Milk,再創建一個安慕希工廠類實現MilkFactory,無需去改動現成的代碼。這樣做,拓展性較好

3.3、抽象 工廠模式

未完待續……

Java23種設計模式