標籤:java之設計模式
一、物件導向思想設計原則
在實際開發中,我們要想更深入的瞭解物件導向思想,就必須熟悉前人總結過的物件導向的思想設計原則。
單一職責原則、開閉原則、裡式替換原則、依賴注入原則、介面分離原則和迪米特原則。
1.1、單一職責原則
核心思想:高內聚,低耦合。
每一個類應該只要一個職責,對外只能提供一種功能,而引起類變化的原因應該只有一個。在設計模式中,所有的設計模式都遵循這一原則。
1.2、開閉原則
核心思想:一個對象對擴充開放,對修改關閉。
其實開閉原則的意思就是:對類的改動是通過增加代碼進行的,而不是修改現有代碼。
也就是說軟體開發人員一旦寫出了可以啟動並執行代碼,就不應該去改動它,而是要保證它能一直運行下去,如何能夠做到這一點呢?這就需要藉助於抽象和多態,即把可能變化的內容抽象出來,從而使抽象的部分是相對穩定的,而具體的實現則是可以改變和擴充的。
1.3、裡氏替換原則
核心思想:在任何父類出現的地方都可以用它的子類來代替。
其實就是說:同一個繼承體系中的對象應該有共同的行為特徵。
1.4、依賴注入原則
核心思想:要依賴於抽象,不要依賴於具體實現。
其實就是說:在應用程式中,所有的類如果使用或依賴於其他的類,則應該依賴這些其他類的抽象類別,而不是這些其他類的具體類。為了實現這一原則,就要求我們在編程的時候針對抽象類別或介面編程,而不是針對具體實現編程。
1.5、介面分離原則
核心思想:不應該強迫程式依賴它們不需要使用的方法。
其實就是說:一個介面不需要提供太多的行為,一個介面應該只提供一種對外的功能,不應該把所有的操作都封裝到一個介面中。
1.6、迪米特原則
核心思想:一個對象應當對其他對象儘可能少的瞭解。
其實就是說:降低各個對象之間的耦合,提高系統的可畏虎行。在模組之間應該只通過介面編程,而不理會模組的內部工作原理,它可以使得各個模組耦合度降到最低,促進軟體的複用。
二、設計模式概述
設計模式是一套被反覆使用、多數人知曉的、經過分類目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼,讓代碼更容易被他人理解,保證代碼可靠性。
設計模式不是一種方法和技術,而是一種思想。
設計模式和具體的語言無關,學習設計模式就是要建立物件導向的思想,儘可能的面向介面編程,低耦合,高內聚,使得設計的程式可複用。
學習設計模式能夠促進物件導向思想的理解,反之亦然,它們相輔相成。
三、設計模式的幾個要素
名字:必須有一個簡單,有意義的名字。
問題:描述在何時使用模式。
解決方案:描述設計的組成部分以及如何解決問題。
效果:描述模式的效果以及優缺點。
四、設計模式的分類
建立型模式:對象的建立 簡單原廠模式,Factory 方法模式,抽象原廠模式,建造者模式,原型模式,單例模式。
結構型模式:對象的組成(結構) 面板模式,適配器模式,代理模式,裝飾模式,橋接模式,組合模式,享元模式。
行為型模式:對象的行為 模板方法模式,觀察者模式,狀態模式,職責鏈模式,命令模式,訪問者模式,策略模式,備忘錄模式。
五、簡單原廠模式
沒有使用簡單原廠模式之前的代碼如下
package cn1;/** * 定義動物類 */public abstract class Animal {public abstract void eat();}
package cn1;public class Cat extends Animal {@Overridepublic void eat() {System.out.println("貓吃魚");}}
package cn1;public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃肉");}}
package cn1;public class AnimalTest {public static void main(String[] args) {Dog d = new Dog();d.eat();Cat c = new Cat();c.eat();}}
使用簡單原廠模式之前的代碼如下
package cn1;/** * 定義動物類 */public abstract class Animal {public abstract void eat();}
package cn1;public class Cat extends Animal {@Overridepublic void eat() {System.out.println("貓吃魚");}}
package cn1;public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃肉");}}
package cn1;public class AnimalFactory {private AnimalFactory(){}public static Dog getDog(){return new Dog();}public static Cat getCat(){return new Cat();}}
package cn1;public class AnimalTest {public static void main(String[] args) {Dog d = AnimalFactory.getDog();d.eat();Cat c = AnimalFactory.getCat();c.eat();}}
但是這樣如果有其他動物,我就要修改工廠了,不好,怎麼辦?
package cn1;/** * 定義動物類 */public abstract class Animal {public abstract void eat();}
package cn1;public class Cat extends Animal {@Overridepublic void eat() {System.out.println("貓吃魚");}}
package cn1;public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃肉");}}
package cn1;public class AnimalFactory {private AnimalFactory(){}public static Animal getAnimal(String name){if("狗".equals(name)){return new Dog();}else if("貓".equals(name)){return new Cat();}return null;}}
package cn1;public class AnimalTest {public static void main(String[] args) {Animal dog = AnimalFactory.getAnimal("狗");if(dog != null){dog.eat();}else{System.out.println("沒有此種動物");}Animal cat = AnimalFactory.getAnimal("貓");if(cat != null){cat.eat();}else{System.out.println("沒有此種動物");}}}
簡單原廠模式:又叫靜態Factory 方法模式,它定義一個具體的工廠類負責建立一些類的執行個體
簡單原廠模式的優點:用戶端不需要再負責對象的建立,從而明確了各個類的職責。
簡答原廠模式的缺點:這個靜態工廠類負責所有對象的建立,如果有新的對象增加,或者某些對象的建立方式不同,就需要不斷的修改工廠類,不利於後期的維護。
六、Factory 方法模式
Factory 方法模式:Factory 方法模式中抽象工廠類負責定義建立對象的介面,具體對象的建立工作由繼承抽象工廠的具體類實現。
優點:用戶端不需要負責對象的建立,從而明確了各個類的職責,如果有新的對象增加,只需要增加一個具體的類和具體的工廠類集合,不影響以後的代碼,後期維護容易,增強了系統的擴充性。
缺點:需要額外的編寫代碼,增加了工作量。
package cn2;public abstract class Animal { public abstract void eat();}
package cn2;public class Cat extends Animal { @Override public void eat() { System.out.println("貓吃魚"); }}
package cn2;public class Dog extends Animal { @Override public void eat() { System.out.println("狗吃肉"); }}
package cn2;public interface Factory { public Animal createAnimal();}
package cn2;public class CatFactory implements Factory { @Override public Animal createAnimal() { return new Cat(); }}
package cn2;public class DogFactory implements Factory { @Override public Animal createAnimal() { return new Dog(); } }
package cn2;public class Test { public static void main(String[] args) { Factory f = new DogFactory(); Animal a = f.createAnimal(); a.eat(); f = new CatFactory(); a = f.createAnimal(); a.eat(); }}
七、單例模式
單例模式:要確保類在記憶體中只有一個對象,該執行個體必須自動建立,並且對外提供。
優點:在系統記憶體中只存在一個對象,因此可以節約系統資源,對於一些需要頻繁建立和銷毀的對象單例模式無疑可以提高系統的效能。
缺點:沒有抽象層,因為擴充很難。職責過重,在一定程度上違背了單一職責。
餓漢式單例模式
package cn3;public class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
package cn3;public class Singleton {private static Student s = new Student();private Singleton(){}public static Student getStudent(){return s;}}
package cn3;public class SingletonTest {public static void main(String[] args) {Student s1 = Singleton.getStudent();Student s2 = Singleton.getStudent();System.out.println(s1 == s2);}}
懶漢式
package cn3;public class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
package cn3;public class Singleton {private static Student s = null;private Singleton(){}public synchronized static Student getStudent(){if(s == null){s = new Student();}return s;}}
package cn3;public class SingletonTest {public static void main(String[] args) {Student s1 = Singleton.getStudent();Student s2 = Singleton.getStudent();System.out.println(s1 == s2);}}
java中單例模式的應用Runtime類。
每一個java應用程式都有一個Runtime類執行個體,使得應用程式能夠與其啟動並執行環境相串連。可以通過getRuntime()方法擷取當前運行時。
應用程式不能建立自己的Runtime類執行個體。
package cn4;import java.io.IOException;/** * 調用windows平台上的記事本軟體 */public class RuntimeTest {public static void main(String[] args) throws IOException {Runtime r = Runtime.getRuntime();r.exec("notepad");}}
本文出自 “11831428” 部落格,請務必保留此出處http://11841428.blog.51cto.com/11831428/1873748
java之設計模式