原型模式与创建者模型
来源:互联网 发布:申请淘宝信用借贷 编辑:程序博客网 时间:2024/05/16 13:42
原型模式就是利用克隆来实现对象的复制,它适用于这种情况:需要一个和已有的对象“长的很像”的对象。比较简单吧。
class A{String name;int age;boolean sex;//man true;female falseint grade;public A(){name = "zhangsan";age = 20;sex = true;grade = 3;}//getter and setterpublic A clone(){return new A();}}
使用clone():
public static void main(String[] args) {// TODO Auto-generated method stubA a = new A();A aa = a.clone();a.name = "lisi";}
有一个A对象a,如果需要一个和a只是名字不同的对象,则可以克隆一个a,然后改改名字就可以了。
可能,A类中的属性也是引用类型的,而且其属性还持有别的引用,如此递归下去。这种情况下使用以上方法就不可行了。在java中提供了序列化机制,只要是实现了Serializable接口的类都可以被序列化,这样我们就可以重写出更好用的clone()了。如:
class Test implements Serializable{B b = new B();public Object deepClone()throws IOException, ClassNotFoundException {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);Test2 test = (Test2)ois.readObject();return test;}}class B implements Serializable{}
如此一来,只要调用deepClone()就可以创建出全新的一个对象了。要注意的是,如果要序列化的某个类中有引用类型没有实现Serializable接口,程序就会抛出异常了。
以上就是原型模式,接下来说说建造者模式。
建造者模式也不常见,也就不细说了。直接上代码吧
class Product{String part1;String part2;String part3;String part4;}class Derector{AbstractBuilder a;public Derector(){}public Derector(AbstractBuilder a){this.a = a;}public Product construct(){a.buildPart1();a.buildPart2();a.buildPart3();a.buildPart4();return a.getResult();}}abstract class AbstractBuilder{protected Product product = new Product();abstract void buildPart1();abstract void buildPart2();abstract void buildPart3();abstract void buildPart4();public Product getResult(){return product;}}class Builder1 extends AbstractBuilder{@Overridepublic void buildPart1() {// TODO Auto-generated method stubproduct.part1 = "以方式一创建 part 1";}@Overridepublic void buildPart2() {// TODO Auto-generated method stubproduct.part2 = "以方式一创建 part 2";}@Overridepublic void buildPart3() {// TODO Auto-generated method stubproduct.part3 = "以方式一创建 part 3";}@Overridepublic void buildPart4() {// TODO Auto-generated method stubproduct.part4 = "以方式一创建 part 4";}}class Builder2 extends AbstractBuilder{@Overridepublic void buildPart1() {// TODO Auto-generated method stubproduct.part1 = "以方式二创建 part 1";}@Overridepublic void buildPart2() {// TODO Auto-generated method stubproduct.part2 = "以方式二创建 part 2";}@Overridepublic void buildPart3() {// TODO Auto-generated method stubproduct.part3 = "以方式二创建 part 3";}@Overridepublic void buildPart4() {// TODO Auto-generated method stubproduct.part4 = "以方式二创建 part 4";}}
代码比较长,但挺简单。不说了。
到此为止,已经学习了五个设计模式,这五个被归为一类:创建型设计模式。学完了这五个设计模式,可以明显的发现,要让系统具有较好的可扩展性,就要面向抽象编程,只有这样,才能“以不变应万变”,越是抽象的东西适用范围越广啊,真是没错呢。
接下来就是结构性设计模式了。
0 0
- 原型模式与创建者模型
- 原型模式 - 创建者模式
- 原型模式(Prototype Pattern)-创建者模式
- java设计模式(五)创建者模式和原型模式
- 设计模式(五)创建者模式和原型模式
- 创建者模式——原型模式(Prototype)(5)
- 创建者模式与工厂模式的区别
- 创建者模式
- 创建者模式
- 创建者模式
- 创建者模式
- 创建者模式
- 创建者模式
- 创建者模式
- 创建者模式
- 创建者模式
- 创建者模式
- 创建者模式
- 用c++编一个3对乒乓球比赛名单的程序
- Windows编程之非模态对话框
- XmlNodelei和XmlElement类
- unixODBC 64位安装及注意事项
- MakeFile
- 原型模式与创建者模型
- 关于Screen.availWidth和Screen.availHeight
- 判断SOCKET连接状态
- 如何正确配置Nginx+PHP及正确的nginx URL重写
- sencha touc 一个页面不同调用注意问题
- Spring的AOP简单介绍和常用配置(3)-事务配置
- Struts2_访问Web元素
- 比较各JAX-RS实现
- Matlab编程和其他语言的区别