范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

设计模式原型模式

  原型模式概述
  原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。
  通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,通常对克隆所产生的对象进行修改对原型对象不会造成任何影响,每一个克隆对象都是相互独立的。 原型模式的类结构
  Client(客户端):客户端提出创建对象的请求。让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。 Prototype(原型接口类):它是声明克隆方法的接口,是所有原型实现类的公共父类。 ConcretePrototype(原型实现类):它实现在原型接口类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
  从类到对象叫"创建",而由本体对象到副本对象则叫"克隆"。当需要创建多个类似的复杂对象时,我们就可以考虑使用原型模式。
  原型模式的核心在于如何实现克隆方法。 原型模式的应用场景
  原型模式主要适用于以下应用场景。
  (1)创建对象成本较大(例如,初始化时间长,占用CPU太多,或者占用网络资源太多等),需要优化资源。
  (2)创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
  (3)系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值。 原型模式的代码实现
  效果图预览
  图片中的所有圆点和五角星都是通过调用clone()方法创建的。
  Shape.java
  图形类,对应原型模式中的Prototype。 /**  * 原型接口  */ public interface Shape extends Cloneable {      Shape clone();      void draw(Graphics g); }
  Circle.java
  圆形类,对应原型模式中的ConcretePrototype。 /**  * 原型实现类:圆形  */ @Data @NoArgsConstructor public class Circle implements Shape {      /** x轴位置 */     private int x;      /** y轴位置 */     private int y;      @Override     public Circle clone() {         Circle clone = null;         try {             clone = (Circle)super.clone();         } catch (CloneNotSupportedException e) {             e.printStackTrace();         }         return clone;     }      @Override     public void draw(Graphics g) {         Graphics2D g2d = (Graphics2D) g;         Ellipse2D.Double circle = new Ellipse2D.Double(this.getX(), this.getY(), 10, 10);          g2d.setColor(Color.RED);         g2d.fill(circle);      } }
  Star.java
  五角星类,对应原型模式中的ConcretePrototype。 /**  * 原型实现类:五角星  */ @Data @NoArgsConstructor public class Star implements Shape {      /** x轴位置 */     private int x;      /** y轴位置 */     private int y;      @Override     public Star clone() {         Star clone = null;         try {             clone = (Star) super.clone();         } catch (CloneNotSupportedException e) {             e.printStackTrace();         }         return clone;     }      @Override     public void draw(Graphics g) {         int xPoints[] = {9, 15, 0, 18, 3};         int yPoints[] = {0, 18, 6, 6, 18};          Graphics2D g2d = (Graphics2D) g;         GeneralPath star = new GeneralPath();          star.moveTo(xPoints[0] + this.getX(), yPoints[0] + this.getY());         for (int i = 1; i < xPoints.length; i++) {             star.lineTo(xPoints[i] + this.getX(), yPoints[i] + this.getY());         }         star.closePath();          g2d.setColor(Color.ORANGE);         g2d.fill(star);      } }
  ShapeFactory.java public class ShapeFactory {     private static Circle circle = new Circle();     private static Star star = new Star();     public static Shape getInstance(String shapeType, int x, int y) {         if (Objects.equals("circle", shapeType)) {             Circle cloneCircle = circle.clone();             cloneCircle.setX(x);             cloneCircle.setY(y);             return cloneCircle;         } else if (Objects.equals("star", shapeType)) {             Star cloneStar = star.clone();             cloneStar.setX(x);             cloneStar.setY(y);             return cloneStar;         }         return null;     } }
  PrototypePanel.java
  面板类,用于绘制图形并展示。 public class PrototypePanel extends JPanel {      private List shapeList = new ArrayList<>();      public PrototypePanel() {         // 设置背景颜色:白色         setBackground(Color.LIGHT_GRAY);         // 设置面板大小: 500 * 500         setPreferredSize(new Dimension(500, 500));          for(int i = 0; i < 20; i++) {             Random random = new Random();             shapeList.add(ShapeFactory.getInstance("circle", random.nextInt(500), random.nextInt(500)));         }          for(int i = 0; i < 20; i++) {             Random random = new Random();             shapeList.add(ShapeFactory.getInstance("star", random.nextInt(500), random.nextInt(500)));         }     }      @Override     protected void paintComponent(Graphics g) {         super.paintComponent(g);         for (Shape shape : shapeList) {             if (shape instanceof Circle) {                 shape.draw(g);             } else if (shape instanceof Star) {                 shape.draw(g);             }         }     }      public static void main(String[] args) {         JFrame jFrame = new JFrame();         jFrame.add(new PrototypePanel());         jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         jFrame.pack();         jFrame.setLocationRelativeTo(null);          jFrame.setVisible(true);     } }深拷贝和浅拷贝
  Java中的变量分为原始类型和引用类型。
  浅拷贝是指只复制原始类型的值。引用类型同样会被拷贝,但是只是拷贝了地址引用。

国内金价暴跌2022年04月28日,千足金各大银行最新黄金金价表国内黄金价格暴跌2022年04月28日,千足金最新价格中国黄金最新价格上海黄金交易所中国银行工商银行建设银行浦发银行等各大银行最新黄金金价表。熟金是生金经过冶炼提纯后的黄金,一般纯刘强东辛苦打下的江山,为何要拱手让给徐雷?1999年,在阿里巴巴创立初期,环顾整个公司,包括马云在内仅仅只有18个人蜗居在一个不到一百平的小小办公室里面。可以说,不管是从公司规模还是员工人数来说,都称得上是十分寒酸了。但是科学家在陨石中发现五种DNA核碱基陨石将五种碱基分子带到地球的概念图。(NASAGoddardCILabDanGallagher)4月26日发表于自然杂志的一份研究称,科学家在陨石中首次发现了嘧啶类核碱基,这使得从被吹上天的5类保健品,或许没啥用,不妨劝告父母,尽量少买受当前养生观念因素所影响,人们针对于市面上所售卖的各类保健药品,也产生强烈的需求购买心理,秉持着药物滋补的思想,过量购买服用,紊乱机体耐药性质。根据最新数据统计表明2021年我国保补钙最快的食物排行榜!牛奶倒数第一,豆腐排第3,建议了解补钙最快的食物排行榜!牛奶倒数第一,豆腐排第3,建议了解。哈喽,大家好,我是大厨江一舟,今天又到了和大家分享美食的时刻了,你准备好了吗?人一旦到了中老年阶段,身体的各项功能都开始下5大食物可催肥,难怪好多人都吃胖了第一类油炸食品油炸类食品包括炸薯条炸鸡炸鱼油条炸糕炸猪排等,口感好,常使人在不知不觉中上瘾。但是,油炸食品含有较高的能量,容易催肥。而且,油炸食品中的过氧化物质,是导致高脂血症和冠建议中老年人补钙别只会喝牛奶,常吃4种食物,手脚有劲身体好导语建议中老年人补钙别只会喝牛奶,常吃4种食物,手脚有劲身体好人到中老年这个阶段,不服老不行,在饮食上需要格外注意,不能胡乱吃,要多吃一些有利于身体的食物。建议中老年人补钙别只会喝立夏将至,要多吃4菜2果,多做一件事,让你健康平安入夏天立夏将至,要多吃4菜2果,多做一件事,让你健康平安入夏天。今天是4月29日了,明天是4月30日,后天就是五月了。5月1日是国际劳动节,国家都会放假几天,今年的劳动节是5天假。到5月国乒喜讯!34岁李晓霞生完二胎后担任新岗位,感谢刘国梁推荐复出前国家乒乓球运动员大满贯选手李晓霞传来好消息,也就是说,她被刘国梁和中国乒乓球协会推荐,正式成为国际乒乓球联合会世界排名工作组的一员,主要工作是不断优化排名标准,为更多的球员提供排4月28日股价底部成交放巨量(股价未来上涨概率大)上市公司名单股价在底部成交放巨量,可能是行情底部启动,也有可能是主力出货,十分值得关注。向左划动可以显示更多内容证券名称成交额较昨日放量倍数2021年来股价最高点跌幅所属行业今日股价今日涨跌幅万丈高楼平地起中国女排20人大名单出炉有感之四在现代女排的整体攻防系统中,自由人位置已经变得越来越重要。女排比赛男子化的趋势一直未曾停止脚步,在东京周期押宝一点攻的队伍,结局都不太完美。一攻不仅需要多点进攻,防反之后也不能只靠
同为数一数二的天才,马晓春与曹薰铉之间的差距为啥如此悬殊中韩围棋领军人物之间,在世界大赛业绩上除了柯洁略微领先朴廷桓一筹之外,大多差距悬殊。譬如聂卫平与曹薰铉相比,前者终身未能夺得世界冠军,后者是九冠王聂卫平之后的领头雁马晓春仅仅是双冠演员蒋雯丽屡遭背叛却不离婚,她的报复让顾长卫有苦难言2009年,导演顾长卫携妻子蒋雯丽为立春做宣传时。有记者看热闹不嫌事大地问为什么女主张静初的戏份几乎都没有了?顾长卫支支吾吾半天回答不出来。最后无奈地问身边的蒋雯丽是啊,为什么没有特雷斯坦汤普森已经初见端倪,有可能成为米国下一个流浪汉美国的流浪汉,有一部分就是这么来的!NBA球员特雷斯坦汤普森,未来也有可能成为他们的一份子!据说,美国的白人女性会专门参加一个培训机构,专门和有钱人婚外恋,生孩子,打官司,然后用孩竟想全身而退?杨元庆切断联想套现3亿,柳传志早已危在旦夕2021年发生了很多事情,而对于联想公司来说更是风雨飘摇的一年。在去年虽然对于它来说是一个多事之秋,但是联想全体员工上下一心,共同面对所面临的各种困难。但是2022年开始之初,联想清静的大海海子曾说面朝大海,春暖花开,道出了对大海的向往之情。生活中的人们提到高级楼房,必定会想到海景房,说明大海是一个神奇的地方,令无数人充满喜爱。也许是大海的辽阔,景色优美,又也许是大海肾结石如何快速排出?做好这3件事,助你排出结石肾脏疾病种类有许多,有部分疾病通过科学治疗可以有效改善,有的疾病只能通过药物使用,手术处理缓解病情。部分人出现的是肾结石,该疾病是晶体物质在肾脏部位不断累积而引起,结石的大小,体积CBA马布里谈爱徒,脸被劈两半,今在京手术,孙铭徽回应不解释北控篮球俱乐部官宣,1月29日是小将廖三宁21岁的生日,全队祝他生日快乐!也感谢球迷们对于廖三宁伤势的关心与牵挂。同时俱乐部也对廖三宁的受伤表示愤慨!并强烈呼吁CBA公司高层,与各备战冬奥从细节抓起备战冬奥从细节抓起(体坛观澜)中国冰雪运动员在备战北京冬奥会时格外注重打磨细节,在刻苦训练中不断挑战自我追求卓越。期待他们在冬奥会赛场出色发挥,用拼搏书写新的奋斗篇章一根长度超过1塔图姆轰3787仍无缘今日最佳!对不起!你碰到NBA怪兽了今日NBA赛场有6组对决,多位球员打出耀眼表现,赛后NBAFantasy根据球员表现评出今日5佳球员,凯尔特人的塔图姆上榜,在凯尔特人vs鹈鹕的比赛中,塔图姆26投17中,轰下37勇士为何放弃乌布雷,而选择波特?1。勇士需要的是一名能护框的前锋。也就是不占球权的蓝领。乌布雷在勇士需要大量球权。勇士有格林和库里持球。在加乌布雷就有点冲突。勇士的中转核心其实是格林。2勇士是库里的勇士。乌布雷在伊藤美诚41,时隔三年再度夺冠,夺冠后大放厥词,陈梦不答应时光飞逝,转眼之间已经是2022年的一月底了,在中国球员欢庆春节假期之际,日本国乒却在全日乒乓球锦标赛上奋勇争冠。在日本国乒阵营中,她可谓是中国国乒最不敢忽视的对手了,小编口中的她