學習下java設計模式(創建者模式)

雖然在平時開發中一直用、但是沒系統學習過這些設計模式、所以特地翻翻網上資料來總結下所謂設計模式尷尬

還記得第一次寫的算法題是八皇后、當時用循環把所有情況列舉出來然後篩選、直到在一年後才知道那種方法叫窮舉吐舌頭



一、工廠模式(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)








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