PrototypePattern(23种设计模式之一)
设计模式六大原则(1):单一职责原则
设计模式六大原则(2):里氏替换原则
设计模式六大原则(3):依赖倒置原则
设计模式六大原则(4):接口隔离原则
设计模式六大原则(5):迪米特法则
设计模式六大原则(6):开闭原则
PrototypePattern,UML抽象图百度找,代码实现如下
使用原型设计模式设计一个克隆对象的过程。
参与者接口
package PrototypePattern;
public interface Person extends Cloneable {
public abstract Person createPerson();
public abstract String printPersonInfo();
}
具体参与者类
package PrototypePattern.Impl;
import PrototypePattern.Person;
public class BeautifulGirl implements Person {
private String name;
private int height;
public BeautifulGirl(String name, int height) {
this.name = name;
this.height = height;
}
public Person createPerson() {
BeautifulGirl girl = null;
try {
girl = (BeautifulGirl)this.clone();
} catch (CloneNotSupportedException ex) {
ex.printStackTrace();
}
return girl;
}
public String printPersonInfo() {
return "This beautiful girl's name is "+name+". she's height is "+height+".";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
测试类
package PrototypePattern;
import PrototypePattern.Impl.BeautifulGirl;
public class Test {
public static void main(String[] args) {
Person girl = new BeautifulGirl("wangzhaojun",170);
Person girl1 = girl.createPerson();
Person girl2 = girl.createPerson();
System.out.println(girl.printPersonInfo());
System.out.println(girl1.printPersonInfo());
System.out.println(girl2.printPersonInfo());
}
}
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
####重点是:
1)克隆的对象与原对象不是同一个对象;
2)克隆对象与原对象的类型一样;
3)如果对象x的equals()方法定义恰当的话,那么x.clone().equals(x)应当是成立的。
####工作原理:
Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
####实用性:
当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者 为了避免创建一个与产品类层次平行的工厂类层次时;或者 当一个类的实例只能有几个不同状态组合中的一种时。 建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
####扩展
类名是一种束缚
如果硬是把类名塞到程序源代码类会发生什么问题?把程序中利用的类名写到里面不是理所当然的吗????
面向对象程序设计的一个目的:“零件化复用”。当源代码里写下类名后,就无法跟该类分离了。必须紧密结合在一起的类名写到源代码内是理所当然的,根本不成问题;真正的问题是应该分离独立成零件的类名却被写到源代码里面了。
别嫌弃我没写注释,这个代码很简单,注释省略,嘿嘿。
PrototypePattern(23种设计模式之一)的更多相关文章
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- Java开发中的23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java开发中的23种设计模式(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- c#中的23种设计模式
C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核 ...
- Java 23种设计模式
转自: http://zz563143188.iteye.com/blog/1847029 ; i<count; i++){ list.add(new MailSender()); } } pu ...
- 从追MM谈Java的23种设计模式(转)
从追MM谈Java的23种设计模式 这个是从某个文章转载过来的.但是忘了原文链接.如果知道的,我追加一下. 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西 ...
- java 23种设计模式及具体例子 收藏有时间慢慢看
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...
- JAVA:23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 从追MM谈Java的23种设计模式
从追MM谈Java的23种设计模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯 德基,只管向服务员说“来四个鸡 ...
- 23种设计模式全解析 (java版本)
转自:http://blog.csdn.net/longyulu/article/details/9159589 其中PHP常用的五种设计模式分别为:工厂模式,单例模式,观察者模式,策略模式,命令模式 ...
随机推荐
- 如何下载中文语言包让Eclipse汉化?
Eclipse软件是JAVA开发必备的软件,对于英语不好的人而言面对英文代码还好,但是软件也是英语的那就头疼了,怎么解决?可以去官网下载中文语言包解压到Eclipse安装目录就可以汉化了. 工具/ ...
- mysql 视图、触发器、事物、存储过程、函数
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- JIRA 的安装和使用
需要的软件 6.0.3-x32.exe jira_6.x_language_zh_CN.jar jira_crack.zip http://pan.baidu.com/s/1dEbpJc1 (从网盘下 ...
- BlockingQueue实现阻塞队列
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public cl ...
- hdoj-3342-Legal or Not(拓扑排序)
题目链接 /* Name:hdoj-3342-Legal or Not Copyright: Author: Date: 2018/4/11 15:59:18 Description: 判断是否存在环 ...
- 20165210 预习作业3 Linux安装及学习
Linux安装及学习 一.Linux安装 通过参考教程:基于VirtualBox虚拟机安装Ubuntu图文教程成功的安装上了Linux但在过程中还是有一些小问题的. 首先按着步骤走,一开始没什么毛病, ...
- cut---Linux下文本处理五大神器之四
转自:http://www.cnblogs.com/dong008259/archive/2011/12/09/2282679.html cut是一个选取命令,就是将一段数据经过分析,取出我们想要的. ...
- Ext.window.Window
var win = Ext.create("Ext.window.Window", { id: "myWin", title: "示例窗口" ...
- JSF使用HTML5的custom attribute
只需要在页面引用这样的命名空间: xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"之后,在JSF的控件的html5属性加上前缀&quo ...
- Spark Tungsten in-heap / off-heap 内存管理机制--待整理
一:Tungsten中到底什么是Page? 1. 在Spark其实不存在Page这个类的.Page是一种数据结构(类似于Stack,List等),从OS层面上讲,Page代表了一个内存块,在Page里 ...