Prototype 原型模式

原型模式:用原型实例指定创建对象的种类并且通过拷贝这些原型创建新的对象。Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象克隆它们自己来实现创建。

假设您要设计一个室内设计软件,软件中有一个展示家具的工具列,您只要点选工具箱就可以产生一个家 具复本,例如一张椅子或桌子,您可以拖曳这个复制的物件至设计图中,随时改变它的位置、颜色等等,当您改变设计图中的物件时,工具列上的原型工具列是不会 跟着一起改变的。

下面的 UML 类别图表示了上述的简单概念:
在此输入图片描述

Prototype模式的重点在于clone(),它负责复制实例并返回,但这个clone()方法比较复杂,尤其是继承了很多对象。在Java中的作法是透过实现一个Cloneable接口,它只是一个声明的接口,并无规定任何实现的方法,您的目的是改写Object的clone ()方法,使其具备有复制物件的功能。

AbstractFurniture.java

public abstract class AbstractFurniture implements Cloneable
{

   public abstract void draw();

    protected Object clone() throws CloneNotSupportedException
    {
         return super.clone();
    }

}

CircleTable.java

  import java.awt.*;

  public  class CircleTable extends AbstractFurniture
  {
        protect Point center;

        public void setCenter(Point center)
        {
                this.center = center;
        }

        public void draw()
        {
            System.out.println("圆桌的中心:("+center.getX()+", "+ center.getY()+")");
        }

        protected Object clone()
        {
            Object o  = super.clone();
            if(this.center!=null)
            {
                ((CircleTable)o).center = (Point)center.clone();
            }
        }
  }

SquareTable.java

import java.awt.*;

public class SquareTable extends AbstractFurniture
{
    protected Rectangle rectangle;    

    public void setRectangle(Rectangle rectangle)
    {
        this.rectangle = rectangle;
    }

    protected Object clone () throws CloneNotSupportedException
    { 
        Object o = super.clone(); 
        if(this.rectangle != null) 
        { 
            ((SquareTable) o).rectangle = (Rectangle) rectangle.clone();
        }

        return o; 
    } 

    public void draw()
    { 
        System.out.print("\t方桌\t位置:(" + rectangle.getX() 
                            + ", " + rectangle.getY()+ ")");
        System.out.println(" / 宽高:(" + 
                         rectangle.getWidth() 
                + ", " + rectangle.getHeight()+ ")");
    }
 }

House.java

public class House
{
    private List<AbstractFurniture> furnitureList = null;

    public House()
    {
        furnitureList = new ArrayList<AbstractFurniture>();
    }

    public void addFurniture(AbstractFurniture furniture)
    {
        furnitureList.add(furniture);

         for(AbstractFurniture furnitureTemp : furnitureList )
         {
             furnitureTemp.draw()
         }
    }
}

Application.java

public class Application
{
        private AbstractFurniture circleTablePrototype;

        public void setCircleTablePrototype(AbstractFurniture circleTablePrototype)
        {
            this.circleTablePrototype = circleTablePrototype;
        }
        public void runAppExample() throws Exception
        {
            House house = new House(); 
            CircleTable circleTable = null;

            // 从工具列选择一个家具加入房子中
            circleTable =
                (CircleTable) circleTablePrototype.clone();
            circleTable.setCenter(new Point(10, 10));
            house.addFurniture(circleTable); 

            // 从工具列选择一个家具加入房子中
            circleTable = (CircleTable) circleTablePrototype.clone();
            circleTable.setCenter(new Point(20, 30));
            house.addFurniture(circleTable);
           }

           public static void main(String[] args)
           {
                Application application = new Application();
                application.setCircleTablePrototype(new CircleTable());
                application.runAppExample();
           }
    }

更加深入的还有关深clone和浅clone等

你可能感兴趣的:(原型模式,原型模式例子,原型模式场景)