研磨设计模式day09原型模式

这篇具有很好参考价值的文章主要介绍了研磨设计模式day09原型模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

场景

代码实现

有何问题

解决方案

代码改造 

模式讲解

原型与new

原型实例与克隆出来的实例

浅度克隆和深度克隆

原型模式的优缺点

思考

何时选用?

相关模式 


场景

研磨设计模式day09原型模式,设计模式,原型模式,java

代码实现

定义订单接口 

package com.zsp.bike.day08原型模式;

/**
 * 订单的接口
 */
public interface OrderApi {
    /**
     * 获取订单数量
     * @return
     */
    public int getOrderProductNum();

    /**
     * 设置订单产品数量
     * @param num 订单产品数量
     */
    public void setOrderProductNum(int num);
}

个人订单实现

package com.zsp.bike.day08原型模式;

/**
 * 个人订单对象
 */
public class PersonalOrder implements OrderApi{
    /**
     * 订购人员姓名
     */
    private String customerName;

    /**
     * 产品编号
     */
    private String productId;

    /**
     * 订单产品数量
     */
    private int orderProductNum = 0;

    @Override
    public int getOrderProductNum() {
        return this.orderProductNum;
    }

    @Override
    public void setOrderProductNum(int num) {
        this.orderProductNum = num;
    }


    @Override
    public String toString() {
        return "PersonalOrder{" +
                "customerName='" + customerName + '\'' +
                ", productId='" + productId + '\'' +
                ", orderProductNum=" + orderProductNum +
                '}';
    }

    public String getCustomerName() {
        return customerName;
    }

    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }



}

企业订单实现

package com.zsp.bike.day08原型模式;

/**
 * 企业订单对象
 */
public class EnterpriseOrder implements OrderApi{
    /**
     * 企业名称
     */
    private String enterpriseName;

    /**
     * 产品编号
     */
    private String productId;

    /**
     * 订单产品数量
     */
    private int orderProductNum = 0;

    @Override
    public int getOrderProductNum() {
        return this.orderProductNum;
    }

    @Override
    public void setOrderProductNum(int num) {
        this.orderProductNum = num;
    }


    public String getEnterpriseName() {
        return enterpriseName;
    }

    public void setEnterpriseName(String enterpriseName) {
        this.enterpriseName = enterpriseName;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    @Override
    public String toString() {
        return "EnterpriseOrder{" +
                "enterpriseName='" + enterpriseName + '\'' +
                ", productId='" + productId + '\'' +
                ", orderProductNum=" + orderProductNum +
                '}';
    }
}

通用的订单处理

package com.zsp.bike.day08原型模式;

/**
 * 处理订单的业务对象
 */
public class OrderBusiness {

    /**
     * 创建订单的方法
     * @param order 订单的接口对象
     */
    public void saveOrder(OrderApi order){
        // 业务要求,当订单数量大于1000,把订单分成两份订单

        //1.判断产品数量是否大于1000
        while (order.getOrderProductNum() > 1000){
        // 2.如果大于,还需要继续拆分
            // 2.1 再新建一份订单,跟传入的订单除了数量不一样外,其他都相同
            OrderApi newOrder = null;
            
            // 如果属于个人订单
            if (order instanceof PersonalOrder){
                // 创建相应的新的订单对象
                PersonalOrder p2 = new PersonalOrder();
                // 然后进行赋值,但是产品数量为1000
                PersonalOrder p1 = (PersonalOrder)order;
                p2.setCustomerName(p1.getCustomerName());
                p2.setProductId(p1.getProductId());
                p2.setOrderProductNum(1000);
                // 再设置给newOrder
                newOrder = p2;
            // 如果属于企业订单    
            }else if(order instanceof EnterpriseOrder){
                // 创建相应的订单对象
                EnterpriseOrder e2 = new EnterpriseOrder();
                // 然后进行赋值,但是产品数量为1000
                EnterpriseOrder e1 = (EnterpriseOrder)order;
                e2.setEnterpriseName(e1.getEnterpriseName());
                e2.setProductId(e1.getProductId());
                e2.setOrderProductNum(1000);
                // 再设置给newOrder
                newOrder = e2;
            }
            // 2.2 原来的订单保留,把数量设置成减少1000
            order.setOrderProductNum(order.getOrderProductNum() - 1000);
            // 然后是业务功能处理,省略了,打印输出看一下
            System.out.println("拆分生成订单==" + newOrder);
        }
        
        //3.不超过1000,那就直接业务功能处理,省略了,打印输出看一下
        System.out.println("订单==" + order);
        
    }
}











客户端使用

package com.zsp.bike.day08原型模式;

public class Client {
    public static void main(String[] args) {
        // 创建订单对象,这里为了演示,直接new了
        PersonalOrder op = new PersonalOrder();
        // 设置订单数据
        op.setOrderProductNum(2925);
        op.setProductId("P0001");
        op.setCustomerName("张三");

        // 这里获取业务处理的类,也直接new了
        OrderBusiness ob = new OrderBusiness();
        ob.saveOrder(op);
    }
}

研磨设计模式day09原型模式,设计模式,原型模式,java

有何问题

研磨设计模式day09原型模式,设计模式,原型模式,java

 简述:

1.订单处理的对象太过依赖与具体实现,划分的很细。

2.如果要增加一种新类型订单,就要增加新的订单类型支持,就要修改这个订单处理逻辑。

解决方案

原型模式

定义:

研磨设计模式day09原型模式,设计模式,原型模式,java

解决思路:

研磨设计模式day09原型模式,设计模式,原型模式,java

代码改造 

1.在订单接口里面写一个克隆自己的方法

package com.zsp.bike.day08原型模式;

/**
 * 订单的接口
 */
public interface OrderApi {
    /**
     * 获取订单数量
     * @return
     */
    public int getOrderProductNum();

    /**
     * 设置订单产品数量
     * @param num 订单产品数量
     */
    public void setOrderProductNum(int num);

    /**
     * 克隆方法
     * @return 订单原型的实例
     */
    public OrderApi cloneOrder();
}

2.如何克隆?

千万不能return this;这么做客户端获取的都是同一个实例,都是指向同一个内存空间的,对克隆出来的对象实例进行修改会影响到原型对象实例。

研磨设计模式day09原型模式,设计模式,原型模式,java

 应该新建一个实例,把所有属性的值复制到新实例中。

个人订单对象修改

package com.zsp.bike.day08原型模式;

/**
 * 个人订单对象
 */
public class PersonalOrder implements OrderApi{
    /**
     * 订购人员姓名
     */
    private String customerName;

    /**
     * 产品编号
     */
    private String productId;

    /**
     * 订单产品数量
     */
    private int orderProductNum = 0;

    @Override
    public int getOrderProductNum() {
        return this.orderProductNum;
    }

    @Override
    public void setOrderProductNum(int num) {
        this.orderProductNum = num;
    }

    @Override
    public OrderApi cloneOrder() {
        PersonalOrder order = new PersonalOrder();
        order.setOrderProductNum(this.orderProductNum);
        order.setCustomerName(this.customerName);
        order.setProductId(this.productId);
        return order;
    }


    @Override
    public String toString() {
        return "PersonalOrder{" +
                "customerName='" + customerName + '\'' +
                ", productId='" + productId + '\'' +
                ", orderProductNum=" + orderProductNum +
                '}';
    }

    public String getCustomerName() {
        return customerName;
    }

    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }



}

 企业订单修改

package com.zsp.bike.day08原型模式;

/**
 * 企业订单对象
 */
public class EnterpriseOrder implements OrderApi{
    /**
     * 企业名称
     */
    private String enterpriseName;

    /**
     * 产品编号
     */
    private String productId;

    /**
     * 订单产品数量
     */
    private int orderProductNum = 0;

    @Override
    public int getOrderProductNum() {
        return this.orderProductNum;
    }

    @Override
    public void setOrderProductNum(int num) {
        this.orderProductNum = num;
    }

    @Override
    public OrderApi cloneOrder() {
        EnterpriseOrder order = new EnterpriseOrder();
        order.setOrderProductNum(this.orderProductNum);
        order.setEnterpriseName(this.enterpriseName);
        order.setProductId(this.productId);
        return order;
    }


    public String getEnterpriseName() {
        return enterpriseName;
    }

    public void setEnterpriseName(String enterpriseName) {
        this.enterpriseName = enterpriseName;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    @Override
    public String toString() {
        return "EnterpriseOrder{" +
                "enterpriseName='" + enterpriseName + '\'' +
                ", productId='" + productId + '\'' +
                ", orderProductNum=" + orderProductNum +
                '}';
    }
}

 处理订单的业务对象修改

package com.zsp.bike.day08原型模式;

/**
 * 处理订单的业务对象
 */
public class OrderBusiness {

    /**
     * 创建订单的方法
     * @param order 订单的接口对象
     */
    public void saveOrder(OrderApi order){
        // 业务要求,当订单数量大于1000,把订单分成两份订单

        //1.判断产品数量是否大于1000
        while (order.getOrderProductNum() > 1000){
        // 2.如果大于,还需要继续拆分
            // 2.1 再新建一份订单,跟传入的订单除了数量不一样外,其他都相同
            OrderApi newOrder = order.cloneOrder();
            // 然后进行赋值,产品数量为1000
            newOrder.setOrderProductNum(1000);
            // 2.2 原来的订单保留,把数量设置成减少1000
            order.setOrderProductNum(order.getOrderProductNum() - 1000);
            // 然后是业务功能处理,省略了,打印输出看一下
            System.out.println("拆分生成订单==" + newOrder);
        }

        //3.不超过1000,那就直接业务功能处理,省略了,打印输出看一下
        System.out.println("订单==" + order);

    }
}











通过研磨设计模式day09原型模式,设计模式,原型模式,java

 用订单的原型实例来指定对象的种类,通过克隆这个原型实例来创建出了一个新的对象实例。

模式讲解

原型模式的功能:

1.通过克隆来创建新的对象实例

2.为克隆出来的新的对象实例复制原型实例属性的值

原型与new

与new不同点在于,new出来的属性是没有值或者只有默认值,克隆出来的实例一般是有值的,它的值就是原型实例的属性的值。

原型实例与克隆出来的实例

克隆完成后,与原型实例是没有关联的,克隆出来的实例属性值发生变化不会影响原型实例。根源在于不是return this; 是复制的,是指向不同内存空间的

需要克隆的类,可以实现java.lang.Cloneable

研磨设计模式day09原型模式,设计模式,原型模式,java

浅度克隆和深度克隆

研磨设计模式day09原型模式,设计模式,原型模式,java

研磨设计模式day09原型模式,设计模式,原型模式,java 

原型模式的优缺点

研磨设计模式day09原型模式,设计模式,原型模式,java

研磨设计模式day09原型模式,设计模式,原型模式,java

研磨设计模式day09原型模式,设计模式,原型模式,java

思考

原型模式的本质:克隆生成对象

创建型模式

何时选用?

研磨设计模式day09原型模式,设计模式,原型模式,java

相关模式 

研磨设计模式day09原型模式,设计模式,原型模式,java

研磨设计模式day09原型模式,设计模式,原型模式,java 

 文章来源地址https://www.toymoban.com/news/detail-672789.html

到了这里,关于研磨设计模式day09原型模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 研磨设计模式day11观察者模式

    目录 场景 代码示例 定义 观察者模式的优缺点 本质 何时选用 简单变型-区别对待观察者 场景 我是一家报社,每当我发布一个新的报纸时,所有订阅我家报社的读者都可以接收到 代码示例 报纸对象 读者,也就是观察者 client  解析: 报社就是一个发布者,读者就是一个个订

    2024年02月11日
    浏览(41)
  • JAVA设计模式----原型设计模式

    定义 :用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 类型 :创建类模式 类图 : 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只

    2024年02月13日
    浏览(51)
  • Java设计模式-原型模式

    原型模式是一种创建型设计模式,它允许在运行时通过复制现有对象来创建新对象,而不是通过构造函数创建。这个模式的核心思想是基于一个现有的对象克隆一个新的对象,这个过程对外部世界是透明的,就像对象从未被克隆过一样。 原型模式的一个关键优点是可以避免在

    2024年02月03日
    浏览(49)
  • 设计模式篇(Java):原型模式

    上一篇:设计模式篇(Java):工厂模式 需求示例—克隆羊 现在有一只羊tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom 羊属性完全相同的10只羊。 不使用设计模式(传统方式)实现: 分析: 优点是比较好理解,简单易操作。 在创建新的对象时,总是需要重

    2024年02月11日
    浏览(41)
  • Java设计模式之 - 原型模式

    原型模式是一种创建型设计模式,它允许我们通过克隆现有对象来创建新对象,而无需从头开始构建对象。 在该模式中,一个原型对象被克隆来生成新的对象,新对象的属性可以根据原型对象来设置,也可以进行修改。 原型模式主要解决的问题是对象的创建成本过高或者对

    2024年02月16日
    浏览(38)
  • Java设计模式-原型模式(3)

         馆长准备了很多学习资料,其中包含 java方面,jvm调优,spring / spring boot /spring cloud ,微服务,分布式,前端,js书籍资料,视频资料,以及各类常用软件工具,破解工具 等资源。请关注“IT技术馆”公众号,进行关注,馆长会每天更新资源和更新技术文章等。请大家多

    2024年01月21日
    浏览(44)
  • Java设计模式之原型模式

            原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。         这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大

    2024年02月10日
    浏览(43)
  • Java原型设计模式

    Java原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新的对象,而无需显式地指定它们的类。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个

    2024年02月13日
    浏览(40)
  • 《Java极简设计模式》第05章:原型模式(Prototype)

    作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 源码地址:https://github.com/binghe001/java-simple-design-patterns/tree/master/java-simple-design-prototype 沉淀,成长,突破,帮助他人,成就自我。 本章难度:★★☆☆☆ 本章重点:用

    2024年02月11日
    浏览(43)
  • Java设计模式之创建型-原型模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析  4.1、通用实现(浅克隆) 4.2、深克隆 五、总结 原型模式通过复制已有对象作为原型,通过复制该原型来返回一个新对象,而不是新建对象,说白了就是不断复制相同的对象罢了。 角色 描述 抽象原型类 规定了具

    2024年02月15日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包