java23種設計模式

我覺得設計模式不是這麼學習的,需要有一定的代碼量之後才能真切明白其中的奧妙,但不得不走這個快捷徑,所以只能掌握其中的一部分

厚顏無恥的只會複製黏貼!

https://www.cnblogs.com/malihe/p/6891920.html

java的設計模式大體上分爲三大類:
創建型模式(5種):工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。
結構型模式(7種):適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。

行爲型模式(11種):策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

 

創建型
抽象工廠模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html
工廠方法 http://www.cnblogs.com/java-my-life/archive/2012/03/25/2416227.html
建造者模式  http://www.cnblogs.com/java-my-life/archive/2012/04/07/2433939.html
原型模式 http://www.cnblogs.com/java-my-life/archive/2012/04/11/2439387.html
單態模式 http://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html

結構型
適配器模式 http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html
橋接模式 http://blog.csdn.net/jason0539/article/details/22568865
組合模式 http://blog.csdn.net/jason0539/article/details/22642281
外觀模式 http://blog.csdn.net/jason0539/article/details/22775311
裝飾者模式 http://www.cnblogs.com/java-my-life/archive/2012/04/20/2455726.html
享元模式 http://www.cnblogs.com/java-my-life/archive/2012/04/26/2468499.html
代理模式 http://www.cnblogs.com/java-my-life/archive/2012/04/23/2466712.html

行爲型
責任鏈模式 http://blog.csdn.net/zhouyong0/article/details/7909456
命令模式 http://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html
解釋器模式 http://www.cnblogs.com/java-my-life/archive/2012/06/19/2552617.html
迭代模式 http://www.cnblogs.com/java-my-life/archive/2012/05/22/2511506.html
中介者模式 http://blog.csdn.net/chenhuade85/article/details/8141831
備忘錄模式 http://www.cnblogs.com/java-my-life/archive/2012/06/06/2534942.html
觀察者模式 http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html
狀態模式 http://www.cnblogs.com/java-my-life/archive/2012/06/08/2538146.html
策略模式 http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html
模板方法模式 http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html
訪問者模式 http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html生產者消費者模式https://monkeysayhi.github.io/2017/10/08/Java%E5%AE%9E%E7%8E%B0%E7%94%9F%E4%BA%A7%E8%80%85-%E6%B6%88%E8%B4%B9%E8%80%85%E6%A8%A1%E5%9E%8B/

 

 

 

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

1、開閉原則(Open Close Principle)

  對擴展開放,對修改關閉。

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

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

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

  這個是開閉原則的基礎,對接口編程,依賴於抽象而不依賴於具體。

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

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

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

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

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

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

 

空談設計模式很枯燥,能結合自己熟悉的實際實現才能更深入的理解個設計模式的好處,設計模式也是爲了解決某些問題而產生的
 

責任鏈模式:java種異常處理,當發生異常時不斷地向上層拋出;

適配器模式:listview 和recyclerview 中 aapter, Adapter並不是經典的適配器模式,但是卻是對象適配器模式的優秀示例,也很好的體現了面向對象的一些基本原則。這裏的Target角色和Adapter角色融合在一起,Adapter中的方法就是目標方法;而Adaptee角色就是ListView的數據集與Item View,Adapter代理數據集,從而獲取到數據集的個數、元素。

1.簡單工廠模式和抽象工廠模式

通過一個方法 可以返回不通的類對象,比如有n個food類 那麼如何通過一個方法返回不同的food呢? 那我們造個factory來生產food,我們只需要跟工廠提交訂單(傳遞參數),工廠給我們返回想要的food不就ok了嗎?

簡單工廠模式 code如下:

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();
        }
    }
}

抽象工廠模式code

 

一個基礎接口定義了功能,每個實現接口的子類就是產品,然後定義一個工廠接口,實現了工廠接口的就是工廠,這時候,接口編程的優點就出現了,我們可以新增產品類(只需要實現產品接口),只需要同時新增一個工廠類,客戶端就可以輕鬆調用新產品的代碼。

  抽象工廠的靈活性就體現在這裏,無需改動原有的代碼,畢竟對於客戶端來說,靜態工廠模式在不改動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();
    }
}

2.單例模式

爲什麼要有單例模式?

code:

懶漢和餓漢兩種方式,其中餓漢式當需要類對象時才創建類對象,會出現線程安全問題;而餓漢式在類加載時會創建對象,不會有線程安全問題但是佔用內存。

實現單例要考慮線程安全和內存佔用問題: 下面是通過 靜態內部類的實現的,使用靜態內部類實現既考慮了線程安全有考慮內存佔用問題,只有再使用靜態內部類時纔會加載靜態內部類,所以纔會創建靜態內部類的類對象,正因爲是加載的時候就創建了此對象,所以就線程安全了唄!

除此還有使用枚舉類實現單例模式!按照《高效Java 第二版》中的說法:單元素的枚舉類型已經成爲實現Singleton的最佳方法。

public class Singleton {
    private Singleton(){}

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

    public Singleton getInstance(){  return  SingletonBuild.value ;}
    
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章