设计模式速记-原型模式

原型模式

原型模式定义:

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

原型模式的例子:

  • java 中 clone()方法
  • 打印机通过PDF文件打印出多份纸质书籍

原型模式就是通过已有对象创建出相同或者相似的多个对象;

原型模式的角色

  • 抽象原型类:规定了具体原型对象必须实现的接口。
  • 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
  • 访问类:使用具体原型类中的 clone() 方法来复制新的对象。

使用场景

  • 资源优化
  • 类初始化需要消耗资源
  • 性能、安全
  • new 对象时需要繁琐的数据准备
  • 一个对象多个修改者

案例

案例描述

使用原型模式对某配置文件类生成多份配置文件

解决思路
  1. 新建配置文件对象(Property),实现Cloneable接口。
  2. 新建配置文件工厂,并使用原型模式实现获取对象实例方法
示例代码
  1. 配置类

    @Data
    @AllArgsConstructor
    public class Property implements Cloneable{
        /**
         * 语言
         */
        private String language;
        /**
         * 单词
         */
        private String word;
    
        @Override
        public Property clone(){
            Property result = null;
            try {
                result = (Property) super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return result;
        }
    
        @Override
        public String toString(){
            return String.format("language:%s,word:%s",this.language,this.word);
        }
    }
    
  2. 配置工厂类

    public class PropertyFactory {
        private static final Property property = new Property("english","hello");
        public static Property getInstance(){
            return property.clone();
        }
    }
    
  3. 测试类

    public class ProtoTypeTest {
    
        @Test
        public void test(){
            Property property1 = PropertyFactory.getInstance();
            Property property2 = PropertyFactory.getInstance();
    
            System.out.println(property1);
            System.out.println(property2);
            System.out.println("property1 == property2 ?" + (property1 == property2));
        }
    }
    
  4. 测试结果

    language:english,word:hello
    language:english,word:hello
    property1 == property2 ?false

Github 地址

https://github.com/duanqiangk/DesignPatternDemo.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值