当前位置: 首页 > news >正文

设计模式之原型模式

为什么80%的码农都做不了架构师?>>>   hot3.png

Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,特别是先学c、c++后学java的程序员。并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。比如函数参数类型是自定义的类时,此时便是引用传递而不是值传递。下面举个小栗子:

比如Shape类 

  Shape shape1=new Shape()这时我们创建了一个shape1引用,我们把值只要赋给Shape类型的引用都可以操纵shape1所指向的引用,如果我们想把对象也复制一份。也就是说完完全全的两份不通过new来构造。

下来来看看UML图;

没什么技巧性的东西就是实现了Cloneable接口,然后重写clone()方法

/**
 * Created by gao.mq on 2017/4/26.
 */
public abstract class Shape implements Cloneable {
    public String type;

    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    abstract void draw();
    @Override
    protected Object clone(){
        Object object=null;
       try {
           object=super.clone();
       }catch (CloneNotSupportedException e){
           e.printStackTrace();
       }
        return object;
    }
}
/**
 * Created by gao.mq on 2017/4/26.
 */
public class Rectangle extends Shape {
    public Rectangle() {
        type = "rectangle";
    }

    @Override
    void draw() {
        System.out.println("draw Rectangle");
    }
}

下面我们用缓存存下这个对象,使用时直接clone就行了

/**
 * Created by gao.mq on 2017/4/26.
 */
public class ShapeCache {
    private static Map<String,Shape> mapCache=new ConcurrentHashMap<>();
    static {
        mapCache.put("rectangle",new Rectangle());
        mapCache.put("square",new Square());
    }
    public static Shape getShape(String type){
       Shape shape= mapCache.get(type);
       return  (Shape)shape.clone();
    }

}

测试

/**
 * Created by gao.mq on 2017/4/26.
 */
public class CloneDemo {
    public static void main(String[] args) {
        Shape cloneShape1 = ShapeCache.getShape("rectangle");
        System.out.println("shape :"+cloneShape1.getType());
        cloneShape1.draw();
      }  
}

其实需要clone对象时直接实现Cloneable接口即可,没有那么麻烦,甚至说谈不上设计模式。

转载于:https://my.oschina.net/gaomq/blog/887290

相关文章:

  • python3 django mysql 连接池说明
  • 【Spring源码分析】AOP源码解析(下篇)
  • 深入浅出设计模式(四)
  • scala-基础-映射(1)
  • struts2的核心和工作原理
  • Linux 有问必答:在 Linux 如何更改文本文件的字符编码
  • 《Node应用程序构建——使用MongoDB和Backbone》一2.4 Socket.io
  • 《C++ 黑客编程揭秘与防范(第2版)》—第6章6.2节详解PE文件结构
  • 《Adobe Illustrator CS5中文版经典教程》—第0课0.16节 使用符号
  • 《Nmap渗透测试指南》—第1章1.3节Linux/Unix源码编译安装Nmap
  • 《嵌入式 Linux C 语言应用程序设计(修订版)》——本章小结
  • 《创意特训营——30天超级灵感唤醒术》—第1章1.4节增加创意的数量
  • 《游戏大师Chris Crawford谈互动叙事》一9.3 互动小说(Interactive Fiction,IF):文字冒险的继承者...
  • 《Wireshark网络分析实战》—第1章1.2节安置Wireshark(程序或主机)
  • 《精通QTP——自动化测试技术领航》—第1章1.2节帮助文档(HELP)-QTP的说明书...
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 10个最佳ES6特性 ES7与ES8的特性
  • 3.7、@ResponseBody 和 @RestController
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • isset在php5.6-和php7.0+的一些差异
  • JavaScript新鲜事·第5期
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Map集合、散列表、红黑树介绍
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Next.js之基础概念(二)
  • PHP 的 SAPI 是个什么东西
  • RxJS: 简单入门
  • Vue.js-Day01
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 大型网站性能监测、分析与优化常见问题QA
  • 动态规划入门(以爬楼梯为例)
  • 关于Java中分层中遇到的一些问题
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用Swoole加速Laravel(正式环境中)
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 用简单代码看卷积组块发展
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #define
  • (14)Hive调优——合并小文件
  • (分布式缓存)Redis分片集群
  • (十) 初识 Docker file
  • (转)Windows2003安全设置/维护
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .net网站发布-允许更新此预编译站点
  • .Net中间语言BeforeFieldInit
  • ??在JSP中,java和JavaScript如何交互?
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [20171106]配置客户端连接注意.txt
  • [Apio2012]dispatching 左偏树
  • [C++]C++基础知识概述
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择