设计模式之原型模式
来源:互联网 发布:linux send 返回值 编辑:程序博客网 时间:2024/06/08 09:05
概要
设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。
定义
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象
使用场景
1.类初始化需要非常多的资源,非常的耗时间
2.通过new产生非常复杂的数据准备或者访问的权限
3.一个对象需要提供给多个调用者使用,并且可能修改其值
UML
上里面的类图很简单,我就做一个简单的介绍
1.IPrototype
定义的原型接口,里面就一个方法,那就是克隆
2.ConcretePrototype
具体的对象,实现了接口IPrototype
代码演示
上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:
(1)定义接口
package com.zengtao.demo.clone;/** * 接口-clones */public interface IPrototype { public MusicPrototype clones();}
(2)具体对象
package com.zengtao.demo.clone;import java.util.ArrayList;import java.util.List;/** * 音乐 */public class MusicPrototype implements IPrototype, Cloneable { private String title; private List<String> voliceList = new ArrayList<String>(); private List<String> lyricsList = new ArrayList<String>(); private List<String> imageList = new ArrayList<String>(); public void addVolice(String content) { voliceList.add(content); } public void addLyrics(String content) { lyricsList.add(content); } public void addImage(String content) { imageList.add(content); } public void setTitle(String title) { this.title = title; } public String getTitle() { return title; } public void show() { System.out.println("歌曲名:" + title); System.out.println(); System.out.println("歌词如下:"); for (int i = 0; i < lyricsList.size(); i++) { System.out.println(lyricsList.get(i).toString()); } System.out.println(); System.out.println("音乐如下:"); for (int i = 0; i < voliceList.size(); i++) { System.out.println(voliceList.get(i).toString()); } System.out.println(); System.out.println("图片如下:"); for (int i = 0; i < imageList.size(); i++) { System.out.println(imageList.get(i).toString()); } } @Override public MusicPrototype clones() { MusicPrototype musicPrototype = null; try { musicPrototype = (MusicPrototype) super.clone(); musicPrototype.title = this.title; musicPrototype.imageList = this.imageList; musicPrototype.voliceList = this.voliceList; musicPrototype.lyricsList = this.lyricsList; } catch (Exception e) { // do nothting } return musicPrototype; }}
(3)调用
package com.zengtao.demo;import com.zengtao.demo.clone.MusicPrototype;public class Main { public static void main(String[] str) { System.out.println("----------------music start------------"); MusicPrototype musicPrototype = new MusicPrototype(); musicPrototype.setTitle("中国人"); musicPrototype.addLyrics("遥远的东方有一条江"); musicPrototype.addLyrics("它的名字就叫长江"); musicPrototype.addLyrics("遥远的东方有一条河"); musicPrototype.addLyrics("它的名字就叫黄河"); musicPrototype.addVolice("音乐1段"); musicPrototype.addVolice("音乐2段"); musicPrototype.addImage("图片1"); musicPrototype.addImage("图片2"); musicPrototype.show(); System.out.println("----------------music end------------"); System.out.println(); System.out.println("----------------new music start--------------"); MusicPrototype musicPrototype2 = musicPrototype.clones(); musicPrototype2.setTitle("龙的传人"); musicPrototype.addLyrics("古老的东方有一条龙"); musicPrototype.addLyrics("它的名字就叫中国"); musicPrototype.addLyrics("古老的东方有一群人"); musicPrototype.addLyrics("他们全都是龙的传人"); musicPrototype2.addVolice("音乐3段"); musicPrototype2.addImage("图片3"); musicPrototype2.show(); System.out.println("----------------new music end--------------"); }}
(4)结果
大家可以看到,实现的例子非常的简单,但是有一点大家要非常的注意
注意点:
1.创建对象的时候,需要很耗时间
2.创建的对象,有多个调用者去操作他或者更改值
举个简单的例子,比如我们录取歌曲的时候,这首歌曲唱完了,对吧,但是我想改变里面的歌词,自定义添加一个mv的画风等
总结
原型模式,在实际过程中使用到的,不是很常见,上面也讲解过了,什么场景下才使用它,至于其它的,大家只需要谨记一点就够了
有些时候使用clone对象,不一定比new对象来的更快,或许更消耗资源,使用者请谨慎后使用。。。
1 0
- 设计模式之原型
- 设计模式之原型
- 设计模式 之 原型
- 设计模式之原型
- 设计模式之原型
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之-原型模式
- 设计模式之 原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之--原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- UVA 11646
- Gradle 动态编译-利用配置文件指定不同软件版本对应的服务器地址
- BZOJ 3680 模拟退火
- css表格练习
- socket 设置非阻塞
- 设计模式之原型模式
- UVA 208 并查集+dfs
- 白话scala系列五 匿名函数分析
- CocoaPods的安装使用及遇到的问题
- UVA 225 剪枝+dfs
- 郑大第九届校赛-正式赛-zzulioj-1812-sort
- Ugly Number
- Struts2简介以及初步搭建配置
- onethink源码success 和error 无法跳转链接