創建型設計模式學習筆記

前言:

    創建型設計模式:

  • 簡單工廠模式(Simple Factory)

  • 工廠方法模式(Factory Method)

  • 抽象工廠模式(Abstract Factory)

  • 建造者模式(Builder)

  • 原型模式(Prototype)

  • 單例模式(Singleton)

簡單工廠模式

模式結構:

java代碼:

public class testClient {

    @Test
    public void main() {
        //根據喜好,工廠自行判斷
        coke coke1 = icebox.getCoke("我喜歡紅色");
        coke1.drink();
        //客戶知道自己想要什麼
        coke coke2 = icebox.getPepsiCoke();
        coke2.drink();
    }
}
  • Factory:負責實例化

public class icebox {
    public static coke getCoke(String type) {
        switch (type) {
            case "我喜歡紅色":
                return new coca_cola();
            case "我喜歡藍色":
                return new pepsi_cola();
            default:
                return new coca_cola();
        }
    }

    public static coke getCocaCoke() {
        return new coca_cola();
    }

    public static coke getPepsiCoke() {
        return new pepsi_cola();
    }
}
  • Product:產品抽象

public interface coke {
    public void drink();
}
  • ConcreteProduct:具體產品

public class coca_cola implements coke{
    @Override
    public void drink() {
        System.out.println("冰鎮的可口可樂真好喝!");
    }
}
public class pepsi_cola implements coke{
    @Override
    public void drink() {
        System.out.println("冰鎮的百事可樂真好喝!");
    }
}

 

工廠方法模式

模式結構:

 

java代碼:

public class testClient {

    @Test
    public void main() {
        //自己家拿可樂
        icebox my = new my_icebox();
        coke coke1 = my.getCoke();
        coke1.drink();
        //商店裏拿可樂
        icebox shop = new shop_icebox();
        coke coke2 = shop.getCoke();
        coke2.drink();
    }
}
  • Creator:工廠抽象

public interface icebox {

    public coke getCoke();

}
  • ConcreteCreator:負責實例化

public class my_icebox implements icebox {
    @Override
    public coke getCoke() {
        return new coca_cola();
    }
}
public class shop_icebox implements icebox{
    @Override
    public coke getCoke() {
        return new pepsi_cola();
    }
}
  • Product:產品抽象

public interface coke {
    public void drink();
}
  • ConcreteProduct:具體產品

public class coca_cola implements coke{
    @Override
    public void drink() {
        System.out.println("冰鎮的可口可樂真好喝!");
    }
}
public class pepsi_cola implements coke{
    @Override
    public void drink() {
        System.out.println("冰鎮的百事可樂真好喝!");
    }
}

 

抽象工廠模式

模式結構:

 

java代碼:

public class testClient {

    @Test
    public void main() {
        //麥當勞
        restaurant m = new MacDonald();
        coke m_c = m.getCoke();
        hanmburger m_h = m.getHanmburger();
        m_c.drink();
        m_h.eat();
        //肯德基
        restaurant k = new KFC();
        coke k_c = k.getCoke();
        hanmburger k_h = k.getHanmburger();
        k_c.drink();
        k_h.eat();
    }
}
  • Creator:工廠抽象

public interface restaurant {

    public coke getCoke();
    
    public hanmburger getHanmburger();

}
  • ConcreteCreator:負責實例化

public class MacDonald implements restaurant {
    @Override
    public coke getCoke() {
        return new coca_cola();
    }

    @Override
    public hanmburger getHanmburger() {
        return new mac_hamburger();
    }
}
public class KFC implements restaurant {
    @Override
    public coke getCoke() {
        return new pepsi_cola();
    }

    @Override
    public hanmburger getHanmburger() {
        return new kfc_hamburger();
    }
}
  • Product:產品抽象

public interface coke {
    public void drink();
}
public interface hanmburger {
    public void eat();
}
  • ConcreteProduct:具體產品

public class coca_cola implements coke{
    @Override
    public void drink() {
        System.out.println("冰鎮的可口可樂真好喝!");
    }
}
public class pepsi_cola implements coke{
    @Override
    public void drink() {
        System.out.println("冰鎮的百事可樂真好喝!");
    }
}
public class mac_hamburger implements hanmburger {
    @Override
    public void eat() {
        System.out.println("麥當勞蔬菜雙層牛堡~");
    }
}
public class kfc_hamburger implements hanmburger {
    @Override
    public void eat() {
        System.out.println("肯德基烤雞腿堡~");
    }
}

 

建造者模式

模式結構:

java代碼:

public class testClient {

    @Test
    public void main() {
        //可口可樂
        coke coca = Director.createCoke(new cocaCokeBuilder());
        coca.drink();
        //百事可樂
        coke pepsi = Director.createCoke(new pepsiCokeBuilder());
        pepsi.drink();
    }
}
  • Director:指揮建造的順序

public class Director {

    public static coke createCoke(cokeBuilder builder) {
        return builder.createCap()
                .createBottle()
                .createLabel()
                .finsh();
    }

}
  • Builder:建造者抽象

public interface cokeBuilder {

    public cokeBuilder createCap();
    public cokeBuilder createBottle();
    public cokeBuilder createLabel();
    public coke finsh();

}
  • ConcreteBuilder:建造者具體實現

public class cocaCokeBuilder implements cokeBuilder {

    private final coke coke = new coke();

    @Override
    public cokeBuilder createCap() {
        coke.setCap("紅色");
        return this;
    }

    @Override
    public cokeBuilder createBottle() {
        coke.setBottle("塑料");
        return this;
    }

    @Override
    public cokeBuilder createLabel() {
        coke.setLabel("可口可樂");
        return this;
    }

    @Override
    public coke finsh() {
        coke.setCoke("可口可樂");
        return coke;
    }
}
public class pepsiCokeBuilder implements cokeBuilder {

    private final coke coke = new coke();

    @Override
    public cokeBuilder createCap() {
        coke.setCap("藍色");
        return this;
    }

    @Override
    public cokeBuilder createBottle() {
        coke.setBottle("塑料");
        return this;
    }

    @Override
    public cokeBuilder createLabel() {
        coke.setLabel("百事可樂");
        return this;
    }

    @Override
    public coke finsh() {
        coke.setCoke("百事可樂");
        return coke;
    }
}
  • Product:需要建造的產品

public class coke {
    private String cap;
    private String bottle;
    private String label;
    private String coke;

    public void setCap(String cap) {
        this.cap = cap;
    }

    public void setBottle(String bottle) {
        this.bottle = bottle;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public void setCoke(String coke) {
        this.coke = coke;
    }

    public void drink(){
        System.out.println(cap + "瓶蓋,"+ bottle + "瓶身," + label + "標誌的" + coke);
    }

}

 

原型模式

模式結構:

java代碼:

public class testClient {

    @Test
    public void main() throws CloneNotSupportedException {
        //淺複製
        cocaCoke c1 = new cocaCoke();
        c1.setType("瓶裝");
        c1.setDesc("小賣部買的");
        c1.setList(new ArrayList<>());
        cocaCoke c2 = (cocaCoke) c1.clone();
        c2.setDesc("家裏拿的");
        System.out.println(c1.toString());
        System.out.println(c2.toString());
        //引用類型共享
        System.out.println(c1.getList() == c2.getList());
        //深複製
        pepsiCoke c3 = new pepsiCoke();
        c3.setType("聽裝");
        c3.setDesc("超市買的");
        c3.setList(new ArrayList<>());
        pepsiCoke c4 = (pepsiCoke) c3.clone();
        c4.setDesc("鄰居送的");
        System.out.println(c3.toString());
        System.out.println(c4.toString());
        //引用類型獨立
        System.out.println(c3.getList() == c4.getList());
    }
}
  • Prototype:原型類,java自帶Cloneable接口

public interface Cloneable {
}
  • ConcretePrototype:具體原型類,實現一個克隆自身的操作

public class cocaCoke implements Cloneable {

    private String type;
    private String desc;
    private List<String> list;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    @Override
    public String toString() {
        return "cocaCoke{" +
                "type='" + type + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class pepsiCoke implements Cloneable {

    private String type;
    private String desc;
    private List<String> list;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    @Override
    public String toString() {
        return "pepsiCoke{" +
                "type='" + type + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        pepsiCoke coke = new pepsiCoke();
        coke.setType(this.type);
        coke.setDesc(this.desc);
        return coke;
    }
}

 

單例模式

模式結構:

java代碼:

public class testClient {

    @Test
    public void main() throws CloneNotSupportedException {
        //餓漢
        cocaCoke coca = cocaCoke.getInstance();
        //懶漢
        pepsiCoke pepsi = pepsiCoke.getInstance();
    }
}
  • Singleton:單例類

public class cocaCoke {
    private static cocaCoke instance = new cocaCoke();
    private cocaCoke(){

    }
    public static cocaCoke getInstance(){
        return instance;
    }

}
public class pepsiCoke {
    private pepsiCoke(){

    }
    private static class SingletonHolder{
        private final static pepsiCoke instance = new pepsiCoke();
    }
    public static pepsiCoke getInstance(){
        return SingletonHolder.instance;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章