写点什么

设计模式之原型模式和建造者模式

作者:共饮一杯无
  • 2023-04-22
    浙江
  • 本文字数:1538 字

    阅读完需:约 5 分钟

设计模式之原型模式和建造者模式

原型模式(Prototype Pattern)

定义:Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。)原型模式类图:



原型模式通用代码:


public class PrototypeClass implements Cloneable{    //覆写父类Object方法    @Override    public PrototypeClass clone(){        PrototypeClass prototypeClass = null;        try {            prototypeClass = (PrototypeClass)super.clone();        } catch (CloneNotSupportedException e) {            //异常处理        }        return prototypeClass;    }}
复制代码


原型模式实际上就是实现 Cloneable 接口,重写 clone()方法。使用原型模式的优点:


  • 性能优良


原型模式是在内存二进制流的拷贝,要比直接 new 一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点。


  • 逃避构造函数的约束


这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的(参见 13.4 节)。使用场景:


  • 资源优化场景


类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。


  • 性能和安全要求的场景


通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。


  • 一个对象多个修改者的场景


一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。浅拷贝和深拷贝:浅拷贝:Object 类提供的方法 clone 只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝,其他的原始类型比如 int、long、char、string(当做是原始类型)等都会被拷贝。💡注意:使用原型模式时,引用的成员变量必须满足两个条件才不会被拷贝:一是类的成员变量,而不是方法内变量;二是必须是一个可变的引用对象,而不是一个原始类型或不可变对象。深拷贝:对私有的类变量进行独立的拷贝如:thing.arrayList = (ArrayList<String>)this.arrayList.clone();

建造者模式(Builder Pattern)

定义:Separate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)建造者模式类图:



  • Product 产品类


通常是实现了模板方法模式,也就是有模板方法和基本方法,例子中的 BenzModel 和 BMWModel 就属于产品类。


  • Builder 抽象建造者


规范产品的组建,一般是由子类实现。例子中的 CarBuilder 就属于抽象建造者。


  • ConcreteBuilder 具体建造者


实现抽象类定义的所有方法,并且返回一个组建好的对象。例子中的 BenzBuilder 和 BMWBuilder 就属于具体建造者。


  • Director 导演类


负责安排已有模块的顺序,然后告诉 Builder 开始建造使用场景:


  • 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。

  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。

  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。


建造者模式与工厂模式的不同:建造者模式最主要的功能是基本方法的调用顺序安排,这些基本方法已经实现了,顺序不同产生的对象也不同;工厂方法则重点是创建,创建零件是它的主要职责,组装顺序则不是它关心的。


本文内容到此结束了,

如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。

如有错误❌疑问💬欢迎各位大佬指出。

主页共饮一杯无的博客汇总👨‍💻

保持热爱,奔赴下一场山海。🏃🏃🏃

发布于: 刚刚阅读数: 2
用户头像

鲜衣怒马意气风发,愿你归来仍是少年。 2018-10-19 加入

全栈开发者,CSDN博客专家,51CTO 专家博主,阿里云专家博主,华为云享专家,持续输出干货,欢迎关注。

评论

发布
暂无评论
设计模式之原型模式和建造者模式_设计模式_共饮一杯无_InfoQ写作社区