我覺得設計模式不是這麼學習的,需要有一定的代碼量之後才能真切明白其中的奧妙,但不得不走這個快捷徑,所以只能掌握其中的一部分
厚顏無恥的只會複製黏貼!
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 ;}
}