1. 程式人生 > >JAVA版23種設計模式綜合專案(實戰),設計模式綜合應用的

JAVA版23種設計模式綜合專案(實戰),設計模式綜合應用的

加入組合模式 n面臨的問題   分析前面直譯器模式的實現,會發現對於客戶端而言,並不想要去區分到底是非終結符物件還是終結符物件,只是想要以一個統一的方式來請求解析。   該怎麼解決這個問題呢? n n用組合模式來解決   n組合模式基礎回顧  初識組合模式 n定義   將物件組合成樹形結構以表示

java的設計模式大體上分為三大類:

  • 建立型模式(5種):工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。
  • 結構型模式(7種):介面卡模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。
  • 行為型模式(11種):策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。

設計模式遵循的原則有6個:

1、開閉原則(Open Close Principle)

  對擴充套件開放,對修改關閉

2、里氏代換原則(Liskov Substitution Principle)

  只有當衍生類可以替換掉基類,軟體單位的功能不受到影響時,基類才能真正被複用,而衍生類也能夠在基類的基礎上增加新的行為。

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

  這個是開閉原則的基礎,對介面程式設計,依賴於抽象而不依賴於具體。

4、介面隔離原則(Interface Segregation Principle)

  使用多個隔離的藉口來降低耦合度。

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

  一個實體應當儘量少的與其他實體之間發生相互作用,使得系統功能模組相對獨立。

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

  原則是儘量使用合成/聚合的方式,而不是使用繼承。繼承實際上破壞了類的封裝性,超類的方法可能會被子類修改。

1. 工廠模式(Factory Method)

  常用的工廠模式是靜態工廠,利用static方法,作為一種類似於常見的工具類Utils等輔助效果,一般情況下工廠類不需要例項化。

  

複製程式碼
interface food{}

class A implements food{}
class B implements food{}
class C implements food{}
public class StaticFactory {
private StaticFactory(){} public static food getA(){ return new A(); } public static food getB(){ return new B(); } public static food getC(){ return new C(); } } class Client{ //客戶端程式碼只需要將相應的引數傳入即可得到物件 //使用者不需要了解工廠類內部的邏輯。 public void get(String name){ food x = null ; if ( name.equals("A")) { x = StaticFactory.getA(); }else if ( name.equals("B")){ x = StaticFactory.getB(); }else { x = StaticFactory.getC(); } } }
複製程式碼

2. 抽象工廠模式(Abstract Factory)

  一個基礎介面定義了功能,每個實現介面的子類就是產品,然後定義一個工廠介面,實現了工廠介面的就是工廠,這時候,介面程式設計的優點就出現了,我們可以新增產品類(只需要實現產品介面),只需要同時新增一個工廠類,客戶端就可以輕鬆呼叫新產品的程式碼。

  抽象工廠的靈活性就體現在這裡,無需改動原有的程式碼,畢竟對於客戶端來說,靜態工廠模式在不改動StaticFactory類的程式碼時無法新增產品,如果採用了抽象工廠模式,就可以輕鬆的新增拓展類。

  例項程式碼:

複製程式碼
interface food{}

class A implements food{}
class B implements food{}

interface produce{ food get();}

class FactoryForA implements produce{
    @Override
    public food get() {
        return new A();
    }
}
class FactoryForB implements produce{
    @Override
    public food get() {
        return new B();
    }
}
public class AbstractFactory {
    public void ClientCode(String name){
        food x= new FactoryForA().get();
        x = new FactoryForB().get();
    }
}
複製程式碼

3. 單例模式(Singleton)

   在內部建立一個例項,構造器全部設定為private,所有方法均在該例項上改動,在建立上要注意類的例項化只能執行一次,可以採用許多種方法來實現,如Synchronized關鍵字,或者利用內部類等機制來實現。

  

複製程式碼
public class Singleton {
    private Singleton(){}

    private static class SingletonBuild{
        private static Singleton value = new Singleton();
    }

    public Singleton getInstance(){  return  SingletonBuild.value ;}
    
}
複製程式碼

4.建造者模式(Builder)

  在瞭解之前,先假設有一個問題,我們需要建立一個學生物件,屬性有name,number,class,sex,age,school等屬性,如果每一個屬性都可以為空,也就是說我們可以只用一個name,也可以用一個school,name,或者一個class,number,或者其他任意的賦值來建立一個學生物件,這時該怎麼構造?

  難道我們寫6個1個輸入的建構函式,15個2個輸入的建構函式.......嗎?這個時候就需要用到Builder模式了。給個例子,大家肯定一看就懂: