前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式】之原型模式

【设计模式】之原型模式

作者头像
青山师
发布2023-05-05 19:02:27
1170
发布2023-05-05 19:02:27
举报
文章被收录于专栏:IT当时语_青山师_JAVA技术栈

原型模式

什么是原型模式?

原型模式属于创造型模式。当要创建的对象类型可以由已经存在的原型对象确定时,就可以使用它。简单来说,使用原型模式,我们是通过clone已经存在的实例来完成的

在 Java 中,创建一个实例是需要花费很大代价的,耗时耗资源。如果存在一种避免创建对象的处理方式,仅仅是复制已经存在的对象,何乐而不为?原型模式给出了这种解决方案。

什么时候使用原型模式?

  • 当通过更改现有对象更新指定的对象时。
  • 加速大型动态加载类的实例化

原型模式示例

汉普斯特德蛋糕公司是一家在伦敦非常有名的提供品质的生日芝士蛋糕公司。 对于每一个需要根据收货方姓名自定义的芝士蛋糕,它们的配料和口味是一样的。 蛋糕公司接到了大量的订单却难以送货,原因在于,为每个订单指定配料和制作奶酪蛋糕花费的时间太长。这样他们就不能生产足够的蛋糕。 如果仅仅是生产一个蛋糕,然后通过多次clone,然后再为每一个蛋糕自定义收货人姓名呢?

原型模式类图
原型模式类图

在这个示例中, CakeStore 类是客户端。客户端通过调用 prepareCake()方法创建多个原型实例。

Cake.java
代码语言:javascript
复制
package org.byron4j.cookbook.designpattern.prototype;

/**
 * 蛋糕的接口类型;可以clone
 */
public interface Cake extends  Cloneable{
    /**
     * 准备生产蛋糕
     * @return
     */
    public Cake prepareCake();
}
CheeseCake.java
代码语言:javascript
复制
package org.byron4j.cookbook.designpattern.prototype;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@AllArgsConstructor
@Data
@Builder
public class CheeseCake implements  Cake{

    /**
     * 糖果
     */
    private String sugar;

    /**
     * 黄油
     */
    private String butter;

    /**
     * 芝士
     */
    private String cheese;

    /**
     * 用户姓名
     */
    private String name;

    @Override
    public Cake prepareCake() {
        Cake cake = null;

        /**
         * 克隆存在的实例
         */
        try {
            cake = (Cake)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return cake;
    }
}
CakeStore.java
代码语言:javascript
复制
package org.byron4j.cookbook.designpattern.prototype;

public class CakeStore {
    public static void main(String[] args){
        CheeseCake cheeseCake = CheeseCake.builder()
                .sugar("100g")
                .butter("200g")
                .cheese("Acapella")
                .build();
        System.out.println("已存在的实例:" + cheeseCake);

        // 利用原型模式自定义多个蛋糕
        CheeseCake cheeseCake1 = (CheeseCake) cheeseCake.prepareCake();
        cheeseCake1.setName("Byron");
        System.out.println("原型模式的第一个实例:" + cheeseCake1);

        CheeseCake cheeseCake2 = (CheeseCake) cheeseCake.prepareCake();
        cheeseCake2.setName("Joy");
        System.out.println("原型模式的第二个实例:" + cheeseCake2);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原型模式
    • 什么是原型模式?
      • 什么时候使用原型模式?
        • 原型模式示例
          • Cake.java
          • CheeseCake.java
          • CakeStore.java
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档