设计模式--原型模式【创建型模式】

设计模式的分类

我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:

  • 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  • 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

在这里插入图片描述

设计模式系列文章传送门

设计模式的 7 大原则

设计模式–单例模式【创建型模式】

设计模式–工厂方法模式【创建型模式】

设计模式–抽象工厂模式【创建型模式】

设计模式–建造者模式【创建型模式】

什么是原型模式

原型模式是通过现有对象复制处一个新对象,而不需要通过构造器等方式来创建对象,原型模式简化了对象的创建过程,在某些特殊场景下,使用原型模式可以减少资源消耗,提高系统性能。

原型模式的组成

  • 抽象原型类:声明了克隆方法的接口,是具体原型类的父类,可以是抽象类也可以是接口,也可以是具体实现类。
  • 具体原型类:它实现了抽象原型类中声明的克隆方法,在克隆方法中返回自己的克隆对象。
  • 客户端类:通过具体抽象原型类的克隆方法来创建对象。

原型模式实现

我们还是用车来做为验证对象。

Prototype(抽象原型类)

定义车的抽象原型类(我们这里定义的是接口),代码如下:

public interface Prototype extends Cloneable{

    //克隆对象的方法
    Prototype clone();

}

此处的 Cloneable 接口是一个标记接口,表示该类可以被克隆。

我们这里继承 Cloneable 接口使用的是浅拷贝,还有一种克隆模式叫做深拷贝,浅拷贝只会拷贝对象的基本数据类型和其他对象的引用,而不会递归地复制引用对象本身。深拷贝会递归地复制整个对象,确保克隆对象与原对象相互完全独立,想要需要实现深拷贝,需要手动编写代码来处理对象中的引用类型属性。

CarPrototype(具体原型类)

定义具体的原型类,代码如下:

public class CarPrototype implements Prototype {

    //座椅
    private String seat;

    //车轮
    private String wheel;

    //车载音响
    private String carAudio;

    public CarPrototype(String seat, String wheel, String carAudio) {
        this.seat = seat;
        this.wheel = wheel;
        this.carAudio = carAudio;
    }

    @Override
    public CarPrototype clone() {
        try {
            return (CarPrototype) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String getSeat() {
        return seat;
    }

    public void setSeat(String seat) {
        this.seat = seat;
    }

    public String getWheel() {
        return wheel;
    }

    public void setWheel(String wheel) {
        this.wheel = wheel;
    }

    public String getCarAudio() {
        return carAudio;
    }

    public void setCarAudio(String carAudio) {
        this.carAudio = carAudio;
    }
	
	@Override
    public String toString() {
        return "CarPrototype{" +
                "seat='" + seat + '\'' +
                ", wheel='" + wheel + '\'' +
                ", carAudio='" + carAudio + '\'' +
                '}';
    }

}

ClientCar(客户端类)

使用客户端类来调用具体的抽象原型类来创建对象,代码如下:

public class ClientCar {

    public static void main(String[] args) {
        //创建原型 car
        CarPrototype carPrototype = new CarPrototype("一汽富维","万向钱潮","瑞声科技");
        System.out.println(carPrototype);
        //克隆car
        CarPrototype cloneCarPrototype = carPrototype.clone();
        System.out.println(cloneCarPrototype);
    }

}

执行客户端代码如下:

CarPrototype{seat='一汽富维', wheel='万向钱潮', carAudio='瑞声科技'}
CarPrototype{seat='一汽富维', wheel='万向钱潮', carAudio='瑞声科技'}

可以看到我们没有使用任何构造方法就创建出了第二个对象。

原型模式的优缺点

优点:

  • 可以快速创建对象,简化了对象的创建过程,提高了对象创建的效率。
  • 可以对外隐藏对象创建和初始化的过程。

缺点:

  • 需要给被克隆的对象增加一个抽象原型类,增加了代码量和复杂度。
  • 不是所有的对象都可以进行克隆。

应用场景

  • 对象创建成本高的场景,使用原型模式来复制对象可以快速的创建对象。
  • 对象创建过程复杂的场景,使用原型模式来复制对象可以简化对象的创建步骤,快速的创建对象。

总结:原型模式相比工厂模式、抽象工厂模式、建造者模式会比较好理解一点,个人觉得原型模式甚至可以粗暴的理解为“复制模式”,就是封装了对象的复制方法,以此来快速创建对象。

如有不正确的地方欢迎各位指出纠正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值