创建型设计模式学习笔记

前言:

    创建型设计模式:

  • 简单工厂模式(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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章