zoukankan      html  css  js  c++  java
  • java设计模式--原型模式

    1,定义:用已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象

    2,原型的主要角色

      抽象原型类:规定了具体原型对象必须实现的接口

      具体原型类:实现抽象原型类的clone()方法,它是可被复制的对象。

      访问类:使用具体原型类中的clone()方法,来复制新的对象

    3,实现

      原型的克隆分为浅克隆和深克隆,java的object类提供了浅克隆的clone()方法,具体原型类只要实现Cloneable接口就可以实现对象的浅克隆

    //具体原型类
    class Realizetype implement Cloneable{
     Realizetype(){
        System.out.println("具体原型创建成功");
      }  
      public Object clone() throws CloneNotSupportedException{
        System.out.println("具体原型复制成功");
        return (Realizetype)super.clone();
      }
    }
    //原型模式的测试类
    public class PrototypeTest{
      public static void main(String[] args) throws CloneNotSupportedException{
        Realizetype o1 = new Realizetype();
        Realizetype o2 = (Realizetype)o1.clone();
        System.out.println(o1==o2);//false
      }
    }
    public class ProtoTypeCitation
    {
        public static void main(String[] args) throws CloneNotSupportedException
        {
            citation obj1=new citation("张三","同学:在2016学年第一学期中表现优秀,被评为三好学生。","韶关学院");
            obj1.display();
            citation obj2=(citation) obj1.clone();
            obj2.setName("李四"); 
            obj2.display();
        }
    }
    //奖状类
    class citation implements Cloneable
    {
        String name;
        String info;
        String college;
        citation(String name,String info,String college)
        {
            this.name=name;
            this.info=info;
            this.college=college;
            System.out.println("奖状创建成功!");
        }
        void setName(String name)
        {
            this.name=name;
        }
        String getName()
        {
            return(this.name);
        }
        void display()
        {
            System.out.println(name+info+college);
        }
        public Object clone() throws CloneNotSupportedException
        {
            System.out.println("奖状拷贝成功!");
            return (citation)super.clone();
        }
    }
    运行结果:
    奖状创建成功!
    张三同学:在2016学年第一学期中表现优秀,被评为三好学生。韶关学院
    奖状拷贝成功!
    李四同学:在2016学年第一学期中表现优秀,被评为三好学生。韶关学院

    4,应用场景

      对象之间相同或相似,即只是极个别的几个属性不同的时候

      对象的创建过程比较麻烦,但是复制比较简单的时候

    5,扩展

      原型模式可扩展为带原型管理器的原型模式,它在原型模式的基础上增加了一个原型管理器 PrototypeManager 类。该类用 HashMap 保存多个复制的原型,Client 类可以通过管理器的 get(String id) 方法从中获取复制的原型。其结构图如图 5 所示。

    例如:用带原型管理器的原型模式来生成包含“圆”和“正方形”等图形的原型,并计算其面积

    import java.util.*;
    interface Shape extends Cloneable
    {
        public Object clone();    //拷贝
        public void countArea();    //计算面积
    }
    class Circle implements Shape
    {
        public Object clone()
        {
            Circle w=null;
            try
            {
                w=(Circle)super.clone();
            }
            catch(CloneNotSupportedException e)
            {
                System.out.println("拷贝圆失败!");
            }
            return w;
        }
        public void countArea()
        {
            int r=0;
            System.out.print("这是一个圆,请输入圆的半径:");
            Scanner input=new Scanner(System.in);
            r=input.nextInt();
            System.out.println("该圆的面积="+3.1415*r*r+"
    ");
        }
    }
    class Square implements Shape
    {
        public Object clone()
        {
            Square b=null;
            try
            {
                b=(Square)super.clone();
            }
            catch(CloneNotSupportedException e)
            {
                System.out.println("拷贝正方形失败!");
            }
            return b;
        }
        public void countArea()
        {
            int a=0;
            System.out.print("这是一个正方形,请输入它的边长:");
            Scanner input=new Scanner(System.in);
            a=input.nextInt();
            System.out.println("该正方形的面积="+a*a+"
    ");
        }
    }
    class ProtoTypeManager
    {
        private HashMap<String, Shape>ht=new HashMap<String,Shape>(); 
        public ProtoTypeManager()
        {
            ht.put("Circle",new Circle());
               ht.put("Square",new Square());
        } 
        public void addshape(String key,Shape obj)
        {
            ht.put(key,obj);
        }
        public Shape getShape(String key)
        {
            Shape temp=ht.get(key);
            return (Shape) temp.clone();
        }
    }
    public class ProtoTypeShape
    {
        public static void main(String[] args)
        {
            ProtoTypeManager pm=new ProtoTypeManager();    
            Shape obj1=(Circle)pm.getShape("Circle");
            obj1.countArea();          
            Shape obj2=(Shape)pm.getShape("Square");
            obj2.countArea();     
        }
    }
  • 相关阅读:
    课程作业(一)
    PTA 5-3 解题报告
    作业(四)
    C#循环语句整理
    C#数组和集合整理
    作业(三)
    1.0总结
    如何在C++中产生随机数
    CLSRSC-400: A system reboot is required to continue installing.
    Upgrade a Non-CDB To a PDB on CDB
  • 原文地址:https://www.cnblogs.com/javadongx/p/shejimoshi_prototype.html
Copyright © 2011-2022 走看看