雖然在平時開發中一直用、但是沒系統學習過這些設計模式、所以特地翻翻網上資料來總結下所謂設計模式
還記得第一次寫的算法題是八皇后、當時用循環把所有情況列舉出來然後篩選、直到在一年後才知道那種方法叫窮舉
一、工廠模式(Factory Method)
1.普通工廠模式
算是工廠模式的基礎、對實現同一接口的不同類進行創建、以傳參進行區分、譬如:
接口
public interface Animal {
public void shut();
}
實現類
public class Dog implements Animal(){
public void shut(){
System.out.println("wang wang!");
}
}
public class Duck implements Animal(){
public void shut(){
System.out.println("gua gua!");
}
}
工廠類
public class Factory{
public Animal produce(String name){
if("dog".equals(name)){
return new Dog();
}else if("duck".equals(name)){
return new Duck();
}
return null;
}
}
測試類
public class Test {
public static void main(String[] args) {
Factory factory = new Factory();
Animal dog = factory.produce("dog");
dog.shut();
}
}
輸出:wang wang!2.多個工廠方法模式
與普通工廠模式差異主要在於由單一produce創建實例改爲多個方法創建不同實例
接口與實現類同上、工廠類方法變更
public class Factory {
public Animal produceDog() {
return new Dog();
}
public Animal produceDuck() {
return new Duck();
}
}
測試類
public class Test {
public static void main(String[] args) {
Factory factory = new Factory();
Animal duck = factory.produceDuck();
duck.shut();
}
}
輸出:gua gua!看別的文章裏說多個工廠方法模式比普通工廠模式要好、不會因爲傳入參數異常而導致創建不了實例、但這兩種模式在擴展類的時候、都需要對工廠類進行修改
3.靜態工廠模式
該模式只需在普通工廠模式或多個工廠方法模式基礎上、對produce方法加上static修飾、省去每次創建實例時都需要先創建工廠再創建所需要實例的步驟
工廠類(基於多個工廠方法模式)
public class Factory {
public static Animal produceDog() {
return new Dog();
}
public static Animal produceDuck() {
return new Duck();
}
}
測試類public class Test {
public static void main(String[] args) {
Animal duck = Factory.produceDuck();
duck.shut();
}
}
輸出:gua gua!二、抽象工廠模式(Abstract Factory)
在工廠模式中我提到對於拓展新類的時候、需要去修改工廠類才能實現新類的添加創建功能、那麼就會頻繁修改工廠類、這並不是我們願意看到的情況;
所以在抽象工廠模式中、我們將工廠類的創建實例方法也拿出來放入接口中、對於不同的創建實例需求來提供不同工廠的實現類
工廠類接口
public interface AnimalFactory {
public Animal produce();
}
兩個工廠類接口的實現類
public class DogFactory implements AnimalFactory {
public Animal produce() {
return new Dog();
}
}
public class DuckFactory implements AnimalFactory {
public Animal produce() {
return new Duck();
}
}
測試類
public class Test {
public static void main(String[] args) {
AnimalFactory dogFactory = new DogFactory();
Animal dog = dogFactory.produce();
dog.shut();
}
}
輸出:wang wang!抽象工廠模式中解決了在拓展功能時需要改動原工廠類代碼的弊端、只要在拓展新類的時候拓展一個相應的工廠實現類即可
三、單例模式(Singleton)
單例模式原則上對於同一類在內存中只有一個實例
優點:
1.節省開支、對於需要反覆創建使用的類、省去了cpu消耗及內存消耗
2.在實際業務中、可以確立相關屬性方法等的唯一性、例如在公司首頁中設立單例、可統計訪客次數
單例工廠
public class Singleton {
private Animal animal = null;
public static Animal produce() {
if (animal == null) {
animal = new Dog();
}
return animal;
}
}
單例模式中設計序列化與多線程等問題、稍後編輯
四、建造者模式(Builder)
在前三種工廠模式中、都只能在一次生產中創建一個產品、而在建造者模式中可以創建多個產品
工廠類
public class Builder {
public List<Animal> produceDog(int count) {
List<Animal> list = new ArrayList<Animal>();
for (int i = 0; i < count; i++) {
list.add(new Dog());
}
return list;
}
}
這裏只創建了單一功能類的多個實例、但是在實際應用中可以根據需要改變建造者模式的具體實現方式、與創建單個實例來說並沒有孰優孰劣、主要還是根據需要來選擇
五、原型模式(Prototype)
以一個對象作爲原型、對其進行克隆、產生一個與其相同的新對象
原型模式屬於創建型模式但不屬於工廠模式、直接調用需要克隆對象的clone方法即可實現、而如果對clone方法進行重寫、需實現Cloneable接口並重寫clone方法
直接調用Object的clone方法爲淺複製
關鍵詞:淺複製、深複製
重寫clone方法
public class Prototype implements Cloneable {
public Object clone() {
return super.clone();
}
}
六、適配器模式(Adapter)
七、裝飾模式(Decorator)
八、代理模式(Proxy)
九、外觀模式(Facede)
十、橋接模式(Bridge)
十一、組合模式(Composite)
十二、享元模式(Flyweight)