PrototypePattern(23种设计模式之一)

本文详细介绍了原型设计模式的概念及其实现方式,并通过一个具体的Java示例展示了如何使用原型模式来克隆对象。此外,还探讨了设计模式的六大原则,并分析了原型模式的实用场景。

设计模式六大原则(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模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.

实用性:

当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者 为了避免创建一个与产品类层次平行的工厂类层次时;或者 当一个类的实例只能有几个不同状态组合中的一种时。 建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

扩展
   类名是一种束缚
   如果硬是把类名塞到程序源代码类会发生什么问题?把程序中利用的类名写到里面不是理所当然的吗????
   面向对象程序设计的一个目的:“零件化复用”。当源代码里写下类名后,就无法跟该类分离了。必须紧密结合在一起的类名写到源代码内是理所当然的,根本不成问题;真正的问题是应该分离独立成零件的类名却被写到源代码里面了。

别嫌弃我没写注释,这个代码很简单,注释省略,嘿嘿。

转载于:https://www.cnblogs.com/1996jiwei/p/6498629.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值