java设计模式之创建者模式(5种)

时间:2024-11-01 14:11:57

设计模式

软件设计模式,又称为设计模式,是一套被反复利用,代码设计经验的总结,他是在软件设计过程中的一些不断发生的问题,以及该问题的解决方案。

**创建者模式又分为以下五个模式:**用来描述怎么“将对象的创建和使用分离”
在这里插入图片描述

UML

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
软件设计原则:开闭原则:对扩展开放,对修改关闭;里氏代换原则:任何基类可以出现的地方,子类一定可以出现。(子类可以扩展父类的功能,但不能改变父类原有的功能);依赖倒转原则:高层模块不应该依赖底层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。接口隔离原则:客户端不应该*依赖于它不使用的方法;一个类对另一个类的依赖应该建立在更小的接口上。迪米特法则:又叫做最少知识原则,如果两个软件实体无法直接通信,那么就不应该发生直接的相互调用,可以通过第三方转发该调用。目的是降低类之间的耦合度。合成复用法则:尽量使用组合或者聚合等关联关系实现,其次才考虑继承关系来实现。

创建者模式

关注点是“怎样创建对象?”主要特点是“将对象的创建和使用分离

单例模式

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。该类提供了一种访问其唯一个对象的方式,可以直接访问,不需要实例化该类的对象。
在这里插入图片描述

单例模式的实现

在这里插入图片描述
饿汉式-静态变量的方式
在这里插入图片描述
饿汉式-静态代码块的方式(随着类的加载而创建)

在这里插入图片描述
懒汉式-线程不安全(首次使用对象才会创建)
在这里插入图片描述
懒汉式-线程安全(加入锁机制导致该方法的执行效果较低)
在这里插入图片描述
懒汉式-双重检查锁
在这里插入图片描述
在这里插入图片描述
懒汉式-静态内部类(保证多线程安全下,并没有任何性能影响)
在这里插入图片描述
枚举方式-极力推荐
在这里插入图片描述
通过序列化和反射来破坏单例模式

简单工厂模式——不是一种设计模式,而是一种编程习惯
结构:抽象产品:定义了产品的规范,描述产品的主要特征和功能。
具体产品:实现或继承抽象产品的子类。具体工厂:提供了创建产品的方法,调用者通过该方法来创建产品。

在这里插入图片描述
在这里插入图片描述

工厂方法模式

概念:定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其工厂的子类。
结构
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

抽象工厂模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
模式扩展
简单工厂+配置文件解除耦合
可以通过工厂模式+配置文件的方式解除工厂对象和产品对象的耦合。在工厂类中加载配置文件中的全类名,并创建对象进行存储,客户端如果需要对象,直接进行获取即可。
1.定义配置文件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

原型模式

概念:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
java中的object类中提供的clone()方法来实现浅克隆,cloneable接口是上面的类图中的抽象原型类,而实现了cloneable接口的子实现类就算具体的原型类。
在这里插入图片描述
在这里插入图片描述

建造者模式

将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.4.6 扩展 - 构建对象
建造者模式除了上面的用途外,在开发中还有一个常用的使用方式,就是当一个类构造器需要传入很多参数时,如果创建这个类的实例,代码可读性会非常差,而且很容易引入错误,此时就可以利用建造者模式进行重构。

重构前

public class Phone {
    private String cpu;
    private String screen;
    private String memory;
    private String mainboard;

    public Phone(String cpu, String screen, String memory, String mainboard) {
        this.cpu = cpu;
        this.screen = screen;
        this.memory = memory;
        this.mainboard = mainboard;
    }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getScreen() {
        return screen;
    }

    public void setScreen(String screen) {
        this.screen = screen;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public String getMainboard() {
        return mainboard;
    }

    public void setMainboard(String mainboard) {
        this.mainboard = mainboard;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", screen='" + screen + '\'' +
                ", memory='" + memory + '\'' +
                ", mainboard='" + mainboard + '\'' +
                '}';
    }
}
public class Client {
    public static void main(String[] args) {
        // 构建Phone对象
        Phone phone = new Phone("intel","三星屏幕","金士顿","华硕");
        System.out.println(phone);
    }
}

重构后使用构建者模式重构代码:

public class Phone {
    private String cpu;
    private String screen;
    private String memory;
    private String mainboard;

    // 私有构造方法
    private Phone(Builder builder) {
        this.cpu = builder.cpu;
        this.screen = builder.screen;
        this.memory = builder.memory;
        this.mainboard = builder.mainboard;
    }

    public static final class Builder {
        private String cpu;
        private String screen;
        private String memory;
        private String mainboard;

        public Builder cpu(String cpu) {
            this.cpu = cpu;
            return this;
        }

        public Builder screen(String screen) {
            this.screen = screen;
            return this;
        }

        public Builder memory(String memory) {
            this.memory = memory;
            return this;
        }

        public Builder mainboard(String mainboard) {
            this.mainboard = mainboard;
            return this;
        }

        // 使用构建者创建Phone对象
        public Phone build() {
            return new Phone(this);
        }
    }

    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", screen='" + screen + '\'' +
                ", memory='" + memory + '\'' +
                ", mainboard='" + mainboard + '\'' +
                '}';
    }
}

在客户端中构建对象:使用起来更灵活方便,某种程度上也可以提高开发效率。

public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone.Builder()
                .cpu("intel")
                .mainboard("华硕")
                .memory("金士顿")
                .screen("三星")
                .build();
        System.out.println(phone);
    }
}

在 Lombok 中只需要使用 @Builder 即可使用构建者模式来构建对象。
在这里插入图片描述