设计模式-原型模式

原型模式-Prototype Pattern

原型模式(Prototype  Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模式是一种对象创建型模式。
抽象原型类:它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。
  
具体原型类:它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
  
客户类:让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。

在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,
      则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。
      在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆。

通用实现方法:

class ConcretePrototype implements Prototype
{
    private String  attr; //成员属性

    public void  setAttr(String attr)
    {
        this.attr = attr;
    }

    public String  getAttr()
    {
        return this.attr;
    }

    public Prototype  clone() //克隆方法
    {
        Prototype  prototype = new ConcretePrototype(); //创建新对象
    
        prototype.setAttr(this.attr);
    
        return prototype;
    }
}

Java语言提供的clone()方法:

class ConcretePrototype implements  Cloneable
{

    ……
    
    public Prototype  clone()
    {
    
      Object object = null;
    
      try {
    
         object = super.clone();
    
      } catch (CloneNotSupportedException exception) {
    
         System.err.println("Not support cloneable");
    
      }
    
      return (Prototype )object;
    }
    
    ……

}

深克隆:

public class WeeklyLog implements Serializable {
    private Attachment attachment;

    private String name;

    private String date;

    private String content;

    public void setAttachment(Attachment attachment) {

        this.attachment = attachment;

    }

    public void setName(String name) {

        this.name = name;

    }

    public void setDate(String date) {

        this.date = date;

    }

    public void setContent(String content) {

        this.content = content;

    }

    public Attachment getAttachment() {

        return (this.attachment);

    }

    public String getName() {

        return (this.name);

    }

    public String getDate() {

        return (this.date);

    }

    public String getContent() {

        return (this.content);

    }


    //使用序列化技术实现深克隆

    public WeeklyLog deepClone() throws IOException, ClassNotFoundException

    {

        //将对象写入流中

        ByteArrayOutputStream bao=new  ByteArrayOutputStream();

        ObjectOutputStream oos=new  ObjectOutputStream(bao);

        oos.writeObject(this);



        //将对象从流中取出

        ByteArrayInputStream bis=new  ByteArrayInputStream(bao.toByteArray());

        ObjectInputStream ois=new  ObjectInputStream(bis);

        return  (WeeklyLog)ois.readObject();

    }
}

来个例子:

抽象公文接口,也可以定义为抽象类,提供clone()方法的实现,将业务方法声明为抽象方法:

public interface OfficialDocument extends Cloneable
{
    public  OfficialDocument clone();

    public abstract void display();
}

公文实现类:

//可行性分析报告(Feasibility Analysis Report)类

class FAR implements OfficialDocument

{

    public  OfficialDocument clone(){
        OfficialDocument copy = null;
        try {
            copy = (OfficialDocument)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return copy;
    }


    public  void display()
    {
        System.out.println("《可行性分析报告》");
    }

}

//软件需求规格说明书(Software Requirements Specification)类

class SRS implements OfficialDocument

{

    public  OfficialDocument clone(){
        OfficialDocument copy = null;
        try {
            copy = (OfficialDocument)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return copy;
    }

    public  void display()
    {
        System.out.println("《软件需求规格说明书》");
    }

}

原型管理器:

//原型管理器(使用饿汉式单例实现)

import java.util.Hashtable;

class  PrototypeManager

{
    //定义一个Hashtable,用于存储原型对象

    private Hashtable ht=new Hashtable();

    private static PrototypeManager pm =  new PrototypeManager();

    //为Hashtable增加公文对象

    private  PrototypeManager()
    {
        ht.put("far",new  FAR());
        ht.put("srs",new  SRS());
    }


    //增加新的公文对象

    public void addOfficialDocument(String  key,OfficialDocument doc)

    {
        ht.put(key,doc);
    }



    //通过浅克隆获取新的公文对象

    public OfficialDocument  getOfficialDocument(String key)
    {
        return  ((OfficialDocument)ht.get(key)).clone();
    }



    public static PrototypeManager  getPrototypeManager()
    {
        return pm;
    }

}
Client类:

class Client

{

    public  static void main(String args[])

    {

        //获取原型管理器对象

        PrototypeManager pm =  PrototypeManager.getPrototypeManager();


        OfficialDocument  doc1,doc2,doc3,doc4;

        doc1  = pm.getOfficialDocument("far");

        doc1.display();

        doc2  = pm.getOfficialDocument("far");

        doc2.display();

        System.out.println(doc1  == doc2);



        doc3  = pm.getOfficialDocument("srs");

        doc3.display();

        doc4  = pm.getOfficialDocument("srs");

        doc4.display();

        System.out.println(doc3  == doc4);

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。
### 内容概要 这份《计算机试卷1》包含多个部分,主要覆盖了计算机基础知识、操作系统应用、文字处理、电子表格、演示文稿制作、互联网应用以及计算机多媒体技术。试卷以单选题开始,涉及计算机历史、基本概念、硬件组成、软件系统、网络协议等。接着是操作应用部分,要求考生在给定的软件环境中完成一系列具体的计算机操作任务。 ### 适用人群 本试卷适用于计算机科学与技术、信息技术相关专业的学生,以及准备计算机水平考试或职业资格认证的人士。它适合那些希望检验和提升自己计算机操作能力的学习者,也适用于教育工作者作为教学评估工具。 ### 使用场景及目标 1. **学习评估**:作为教育机构的课程评估工具,帮助教师了解学生对计算机基础知识的掌握程度。 2. **自学检验**:供个人自学者检验自己的计算机操作技能和理论知识,为进一步学习提供方向。 3. **职业发展**:为职场人士提供计算机技能的自我提升途径,增强其在信息时代的竞争力。 4. **考试准备**:为准备计算机相关考试的考生提供实战演练的机会,加强考试自信。 5. **教学资源**:教师可以将其作为教学资源,设计课程和实验,提高教学效果。 试卷的目标是通过理论知识的测试和实践技能的操作,全面提升考生的计算机应用能力。考生应掌握从基础的计算机组成原理到复杂的数据处理、演示文稿制作、网络应用以及多媒体技术处理等多方面技能。通过本试卷的学习与练习,考生将能够更加熟练地使用计算机解决实际问题,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值