在一个老板和他的工程师在参观世博会的时候,老板说:“中国馆好壮观,你给我造一个中国馆”,工程师说:“那我们要造成什么样的呢?”老板指着中国馆说:“就和那个一模一样的!”。那么从老板的角度来讲,他采用的就是,Prototype模式,即原型模式。否则,他需要再花费一些时间和工程师一点一点地探讨关于中国馆的一些设计问题。所谓的在面向对象设计模式里的原型模式,就是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
    但老板想要一个程序,要么馆就复制什么馆,代码如下,但总运行时出错,期待高手解决一下,谢谢。
package pattern;class Engineer{
   public static Pavilion build(Pavilion pavilion) throws CloneNotSupportedException{
      return (Pavilion)pavilion.clone();
   }
}abstract class Pavilion{
    private String name = "No name";
    public String getName(){
       return name;
    }
    public void setName(String name){
       this.name = name;
    }
    
    public Object clone() throws CloneNotSupportedException{
       return null;
    }
}class ChinaPavilion extends Pavilion{
   public ChinaPavilion(String name){
      super.setName(name);
   }
   public Object clone() throws CloneNotSupportedException{    
      Object object = null;    
   System.out.println("Start Copy pavilion...");
   object = super.clone();    
   return object;    
 }
}public class Prototype {
   public static void main(String[] args) throws CloneNotSupportedException {
      Pavilion buildPavilion = Engineer.build(new ChinaPavilion("China"));
      System.out.println(buildPavilion.getName());
   }
}

解决方案 »

  1.   


    public Object clone() throws CloneNotSupportedException{
           return null;
        }
    这里怎么让他返回null了。报空指针
      

  2.   

    ChinaPavilion 调用父类有问题class ChinaPavilion extends Pavilion{
        public ChinaPavilion(String name) {
            super.setName(name);
        }    public Object clone() throws CloneNotSupportedException {
            Object object = null;
            System.out.println("Start Copy pavilion...");
            object = super.clone();//调用父类返回是NULL呀
            return object;
        }
    }
      

  3.   

    java的原型模式可借助Cloneable接口实现。
    package pattern;class Engineer {
        public static Pavilion build(Pavilion pavilion) throws CloneNotSupportedException {
            return (Pavilion) pavilion.clone();
        }
    }abstract class Pavilion implements Cloneable {
        private String name = "No name";    public String getName() {
            return name;
        }    public void setName(String name) {
            this.name = name;
        }    public Object clone() throws CloneNotSupportedException {
            Object o = null;
            try {
                o = super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return o;
        }
    }class ChinaPavilion extends Pavilion implements Cloneable {
        public ChinaPavilion(String name) {
            super.setName(name);
        }    public Object clone() throws CloneNotSupportedException {
            System.out.println("Start Copy pavilion...");        try {
                return super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }        return null;
        }
    }public class Prototype {
        public static void main(String[] args) throws CloneNotSupportedException {
            Pavilion buildPavilion = Engineer.build(new ChinaPavilion("China"));
            System.out.println(buildPavilion.getName());
        }
    }
      

  4.   

     implements Cloneable 是必需的吗??
      

  5.   

    是必须的
    原型模式: 1、定义:原型模式就是通过一个原型对象来表明要创建的对象类型,然后用复制这个对象的方法来创建更痛类型的对象。 2、原理:有两部分组成,抽象原型和具体原型。 3、使用时机:系统需要 创建吃的对象是动态加载的,而且产品具有一定层次时,可以考虑使用原型模式。 1>当要实例化的类是在运行时刻指定时,例如,通过动态装载; 2>或者为了避免创建一个与产品类层次平行的工厂类层次时; 3>或者当一个类的实例只能有几个不同状态组合中的一种时。 4>建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 4、效果: 1>可以再运行时刻增加和删除产品。 2>可以通过改变值来指定产品。 3>可以通过改变结构来指定新对象。 4>减少子类的构造 5>可以用类动态配置应用。 5、实现: 1>使用一个原型管理器 2>实现克隆操作(浅拷贝和深拷贝) 3>初始化克隆对象。 6、使用原型模式的意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 7、解决的问题: 比如有一个对象,在某一时刻该对象中已经包含了一些有效的值,此时可能会需要一个和该对象完全相同的新对象,并且此后对新对象的任何改动都不会影响到原来对象中的值,也就是说新对象与原来的对象是两个独立的对象,但新对象的初始值是由原来的对象确定的。
      

  6.   

    原型模式:1、定义:原型模式就是通过一个原型对象来表明要创建的对象类型,然后用复制这个对象的方法来创建更痛类型的对象。2、原理:有两部分组成,抽象原型和具体原型。3、使用时机:系统需要 创建吃的对象是动态加载的,而且产品具有一定层次时,可以考虑使用原型模式。1>当要实例化的类是在运行时刻指定时,例如,通过动态装载;2>或者为了避免创建一个与产品类层次平行的工厂类层次时;3>或者当一个类的实例只能有几个不同状态组合中的一种时。4>建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。4、效果:1>可以再运行时刻增加和删除产品。2>可以通过改变值来指定产品。3>可以通过改变结构来指定新对象。4>减少子类的构造5>可以用类动态配置应用。5、实现:1>使用一个原型管理器2>实现克隆操作(浅拷贝和深拷贝)3>初始化克隆对象。 6、使用原型模式的意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。7、解决的问题:比如有一个对象,在某一时刻该对象中已经包含了一些有效的值,此时可能会需要一个和该对象完全相同的新对象,并且此后对新对象的任何改动都不会影响到原来对象中的值,也就是说新对象与原来的对象是两个独立的对象,但新对象的初始值是由原来的对象确定的。
      

  7.   

    稍微精简了下class Engineer {
        public static Pavilion build(Pavilion pavilion) throws CloneNotSupportedException {
            return (Pavilion) pavilion.clone();
        }
    }abstract class Pavilion implements Cloneable {
        private String name = "No name";    public String getName() {
            return name;
        }    public void setName(String name) {
            this.name = name;
        }    public Object clone() throws CloneNotSupportedException {
            Object o = null;
            try {
                o = super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return o;
        }
    }class ChinaPavilion extends Pavilion implements Cloneable {
        public ChinaPavilion(String name) {
            super.setName(name);
        }    public Object clone() throws CloneNotSupportedException {
            System.out.println("Start Copy pavilion...");        try {
                return super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }        return null;
        }
    }public class Prototype {
        public static void main(String[] args) throws CloneNotSupportedException {
            Pavilion buildPavilion = Engineer.build(new ChinaPavilion("China"));
            System.out.println(buildPavilion.getName());
        }
    }
      

  8.   

    NND上面的COPY错了 7楼的确实有些,即使你再厉害也不应该.class Pavilion implements Cloneable {
    public Object clone() throws CloneNotSupportedException {
          return super.clone();
        }
    }class ChinaPavilion extends Pavilion{
        public ChinaPavilion clone() throws CloneNotSupportedException {
         System.out.println("china");
         return (ChinaPavilion)super.clone();
        }
    }
    class BuildPavilion{
    public static Pavilion build(Pavilion pavilion) throws CloneNotSupportedException{
    return (Pavilion)pavilion.clone();
    }
    }
    public class Prototype {
        public static void main(String[] args) throws CloneNotSupportedException {
         System.out.println("build...");
            Pavilion buildPavilion = BuildPavilion.build(new ChinaPavilion());
        }
    }
      

  9.   

    这段代码只能算一个类的浅克隆实现,最近我又在看设计模式,设计模式我在很早以前就看过,当时的理解和现在做过一些项目,写过大量的代码后看的效果和理解完全不一样,理解起来会更深刻,也容易看懂作者的观点,要循序渐进。
    以我的理解应该这样说:
    建一个中国馆的对象,在初始化的时候需要读大量的设计图纸进行解析获得参数(这个过程消耗很大,而且每次建中国馆都是读同样的图纸),这时候就需要使用原型模式,因为clone一个对象比去初始化new一个对象开销更小。而有些时候clone一个对象不一定比new一个对象开销大也就不需要用什么模式了,直接new多省事。