Java開發中的設計模式

2、設計模式的六大原則java

一、開閉原則(Open Close Principle)編程

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

二、里氏代換原則(Liskov Substitution Principle)架構

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

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

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

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

這個原則的意思是:使用多個隔離的接口,比使用單個接口要好。仍是一個下降類之間的耦合度的意思,從這兒咱們看出,其實設計模式就是一個軟件的設計思想,從大型軟件架構出發,爲了升級和維護方便。因此上文中屢次出現:下降依賴,下降耦合。spa

五、迪米特法則(最少知道原則)(Demeter Principle).net

爲何叫最少知道原則,就是說:一個實體應當儘可能少的與其餘實體之間發生相互做用,使得系統功能模塊相對獨立。

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

原則是儘可能使用合成/聚合的方式,而不是使用繼承。


1、設計模式的分類

整體來講設計模式分爲三大類:

建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

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

其實還有兩類:併發型模式和線程池模式。用一個圖片來總體描述一下:




一、工廠方法模式(Factory Method)

工廠方法模式分爲三種:

十一、普通工廠模式,就是創建一個工廠類,對實現了同一接口的一些類進行實例的建立。首先看下關係圖:

舉例以下:(咱們舉一個發送郵件和短信的例子)

首先,建立兩者的共同接口:

[java] view plaincopy

  1. public interface Sender {  

  2.     public void Send();  

  3. }  

其次,建立實現類:

[java] view plaincopy

  1. public class MailSender implements Sender {  

  2.     @Override  

  3.     public void Send() {  

  4.         System.out.println("this is mailsender!");  

  5.     }  

  6. }  

[java] view plaincopy

  1. public class SmsSender implements Sender {  

  2.   

  3.     @Override  

  4.     public void Send() {  

  5.         System.out.println("this is sms sender!");  

  6.     }  

  7. }  

最後,建工廠類:

[java] view plaincopy

  1. public class SendFactory {  

  2.   

  3.     public Sender produce(String type) {  

  4.         if ("mail".equals(type)) {  

  5.             return new MailSender();  

  6.         } else if ("sms".equals(type)) {  

  7.             return new SmsSender();  

  8.         } else {  

  9.             System.out.println("請輸入正確的類型!");  

  10.             return null;  

  11.         }  

  12.     }  

  13. }  

咱們來測試下:

  1. public class FactoryTest {  

  2.   

  3.     public static void main(String[] args) {  

  4.         SendFactory factory = new SendFactory();  

  5.         Sender sender = factory.produce("sms");  

  6.         sender.Send();  

  7.     }  

  8. }  

輸出:this is sms sender!



2二、多個工廠方法模式,是對普通工廠方法模式的改進,在普通工廠方法模式中,若是傳遞的字符串出錯,則不能正確建立對象,而多個工廠方法模式是提供多個工廠方法,分別建立對象。關係圖:

將上面的代碼作下修改,改動下SendFactory類就行,以下:

[java] view plaincopypublic class SendFactory {  

   public Sender produceMail(){  

  1.         return new MailSender();  

  2.     }  

  3.       

  4.     public Sender produceSms(){  

  5.         return new SmsSender();  

  6.     }  

  7. }  

測試類以下:

[java] view plaincopy

  1. public class FactoryTest {  

  2.   

  3.     public static void main(String[] args) {  

  4.         SendFactory factory = new SendFactory();  

  5.         Sender sender = factory.produceMail();  

  6.         sender.Send();  

  7.     }  

  8. }  

輸出:this is mailsender!

3三、靜態工廠方法模式,將上面的多個工廠方法模式裏的方法置爲靜態的,不須要建立實例,直接調用便可。

[java] view plaincopy

  1. public class SendFactory {  

  2.       

  3.     public static Sender produceMail(){  

  4.         return new MailSender();  

  5.     }  

  6.       

  7.     public static Sender produceSms(){  

  8.         return new SmsSender();  

  9.     }  

  10. }  

[java] view plaincopy

  1. public class FactoryTest {  

  2.   

  3.     public static void main(String[] args) {      

  4.         Sender sender = SendFactory.produceMail();  

  5.         sender.Send();  

  6.     }  

  7. }  

輸出:this is mailsender!

整體來講,工廠模式適合:凡是出現了大量的產品須要建立,而且具備共同的接口時,能夠經過工廠方法模式進行建立。在以上的三種模式中,第一種若是傳入的字符串有誤,不能正確建立對象,第三種相對於第二種,不須要實例化工廠類,因此,大多數狀況下,咱們會選用第三種——靜態工廠方法模式。


二、抽象工廠模式(Abstract Factory)




請看例子:

[java] view plaincopy

  1. public interface Sender {  

  2.     public void Send();  

  3. }  

兩個實現類:

[java] view plaincopy

  1. public class MailSender implements Sender {  

  2.     @Override  

  3.     public void Send() {  

  4.         System.out.println("this is mailsender!");  

  5.     }  

  6. }  

[java] view plaincopy

  1. public class SmsSender implements Sender {  

  2.   

  3.     @Override  

  4.     public void Send() {  

  5.         System.out.println("this is sms sender!");  

  6.     }  

  7. }  

兩個工廠類:

[java] view plaincopy

  1. public class SendMailFactory implements Provider {  

  2.       

  3.     @Override  

  4.     public Sender produce(){  

  5.         return new MailSender();  

  6.     }  

  7. }  

[java] view plaincopy

  1. public class SendSmsFactory implements Provider{  

  2.   

  3.     @Override  

  4.     public Sender produce() {  

  5.         return new SmsSender();  

  6.     }  

  7. }  

在提供一個接口:

[java] view plaincopy

  1. public interface Provider {  

  2.     public Sender produce();  

  3. }  

測試類:

[java] view plaincopy

  1. public class Test {  

  2.   

  3.     public static void main(String[] args) {  

  4.         Provider provider = new SendMailFactory();  

  5.         Sender sender = provider.produce();  

  6.         sender.Send();  

  7.     }  

  8. }  

其實這個模式的好處就是,若是你如今想增長一個功能:發及時信息,則只需作一個實現類,實現Sender接口,同時作一個工廠類,實現Provider接口,就OK了,無需去改動現成的代碼。這樣作,拓展性較好!

相關文章
相關標籤/搜索