设计模式(三):初识设计模式

234 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

上一篇文章介绍了设计模式的三大类型以及创建型模式中的单例模式,感兴趣的同学请移步设计模式(二):初识设计模式

今天给大家介绍一下创建型模式中其他的几种模式

创建型模式

工厂模式

工厂模式的意义是将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦,从而提高项目的扩展和维护性。工厂模式一般分为三种:简单工厂、工厂方法、抽象工厂,接下来介绍一下这三种工厂模式的优缺点和实现方式。

1.简单工厂模式

简单工厂是由一个工厂对象决定创建出哪一种产品类的实例,也就是定义一个创建对象的类,由这个类来封装实例化对象的行为。

代码演示:

public class SimpleFactroy {
    public Drink create(String type){
        Drink drink = null;
        if(type.equals("cola")){
            drink = new Cola();
            drink.setName("可乐");
        }else if(type.equals("milk")){
            drink = new Milk();
            drink.setName("牛奶");
        }
    }
}

优点 容易理解,简单易操作。

缺点违反了开闭原则,即对扩展开放,对修改关闭。

2.工厂方法模式

定义了一个创建对象的抽象方法,由子类决定要实例化的类,即将对象的实例化推迟到子类。

代码演示:

public abstract class Factory{
    abstract Drink create(String type);
}

优点 符合开闭原则,在添加新产品时,仅需添加一个实现类。

缺点当产品数量过多时,系统复杂度增加。

3.抽象工厂

提供一个创建一系列相关或相互依赖对象的接口,而无需指定具体的类。

代码演示:

public interface Factory{
    public Drink create(String type);
}

优点 利于代码的维护和扩展

建造者模式

建造者模式又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同属性的对象。

建造者模式有四个角色,分别是:

1.Product(产品角色):一个具体的产品对象。

2.Builder(抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类。

3.ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件。

4.Director(指挥者):构建一个使用Builder接口的对象

代码演示:

第一步,创建产品角色电脑

public class Computer {
    private String cpu;
    private String ram;
    private int usbCount;
    private String keyboard;
    private String displayCard;

    public Computer(String cpu, String ram) {
        this.cpu = cpu;
        this.ram = ram;
    }
    public void setUsbCount(int usbCount) {
        this.usbCount = usbCount;
    }
    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }
    public void setDisplay(String displayCard) {
        this.displayCard = displayCard;
    }
    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + ''' +
                ", ram='" + ram + ''' +
                ", usbCount=" + usbCount +
                ", keyboard='" + keyboard + ''' +
                ", displayCard='" + displayCard + ''' +
                '}';
    }
}

第二步,创建抽象建造者

public abstract class ComputerBuilder {
    public abstract void setUsbCount();
    public abstract void setKeyboard();
    public abstract void setDisplayCard();

    public abstract Computer getComputer();
}

第三步,创建具体建造者,在这里我们构建两种品牌的电脑

public class MacComputerBuilder extends ComputerBuilder {
    private Computer computer;
    public MacComputerBuilder(String cpu, String ram) {
        computer = new Computer(cpu, ram);
    }
    @Override
    public void setUsbCount() {
        computer.setUsbCount(2);
    }
    @Override
    public void setKeyboard() {
        computer.setKeyboard("苹果键盘");
    }
    @Override
    public void setDisplayCard() {
        computer.setDisplayCard("苹果显示器");
    }
    @Override
    public Computer getComputer() {
        return computer;
    }
}

public class LenovoComputerBuilder extends ComputerBuilder {
    private Computer computer;
    public LenovoComputerBuilder(String cpu, String ram) {
        computer=new Computer(cpu,ram);
    }
    @Override
    public void setUsbCount() {
        computer.setUsbCount(4);
    }
    @Override
    public void setKeyboard() {
        computer.setKeyboard("联想键盘");
    }
    @Override
    public void setDisplayCard() {
        computer.setDisplayCard("联想显示器");
    }
    @Override
    public Computer getComputer() {
        return computer;
    }
}

第四步,创建指挥者

public class ComputerDirector {
    public void makeComputer(ComputerBuilder builder){
        builder.setUsbCount();
        builder.setDisplayCard();
        builder.setKeyboard();
    }
}

优点 增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合"开闭原则"。

缺点如果产品内部变化复杂,可能会导致定义很多具体建造者来实现变化,导致系统复杂,难以维护。

原型模式

原型模式是指用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象

代码演示:

public class sheep implements Cloneable{
   private String name;
   private int age;
   private String color;

   public sheep(String name, int age, String color) {
      this.name = name;
      this.age = age;
      this.color = color;
   }
   
   ......
   
   @Override
   protected Object clone() throws CloneNotSupportedException {
      return super.clone();
   }
}

优点简化对象的创建过程,提高效率

缺点在实现深克隆的时候可能需要比较复杂的代码

如有不对的地方,欢迎大家指正。