其他分享
首页 > 其他分享> > 原型模式

原型模式

作者:互联网

Prototype Patterns

GoF:使用原型的(prototypical)实例来指定可以创建的一些对象,并且通过复制原型对象来创建这些新对象

概念

创建一个新对象被认为是花销比较大的操作。原型模式是作为创建新对象的一种替代做法(通过复制)。这里我们注重于减少创建新对象的花销

例子

现实世界:假如我们有一个重要文档,现在要对它进行修改,那么应该先在它的副本上做修改
代码世界:如果我们已经创建了一个应用,现在要做一个新应用,且这个新应用只需要对已有的应用做一些小修改,那么我们不会再从头开始来创建应用

展示

代码

public class PrototypePatternEx
{
    public static void main(String[] args) throws CloneNotSupportedException
    {
        System.out.println("***Prototype Pattern Demo***\n");
        BasicCar nano_base = new Nano("Green Nano");
        nano_base.setPrice();
        BasicCar ford_basic = new Ford("Ford Yellow");
        ford_basic.setPrice();

        BasicCar bc1;
        //Clone Nano Object
        bc1 = nano_base.clone();
        //Price will be more than 100000 for sure
        bc1.setPrice(nano_base.getPrice()+bc1.setPrice());
        System.out.println("Car is: "+ bc1.getModelName()+" and it's price is Rs."+bc1.getPrice());
        //Clone Ford Object
        bc1 =ford_basic.clone();
        //Price will be more than 500000 for sure
        bc1.setPrice(ford_basic.getPrice()+bc1.setPrice());
        System.out.println("Car is: "+ bc1.getModelName()+" and it's price is Rs."+bc1.getPrice());
    }
}

abstract class BasicCar implements Cloneable
{
    private String modelName;
    private double price;

    public String getModelName()
    {
        return modelName;
    }

    public void setModelName(String modelName)
    {
        this.modelName = modelName;
    }

    public void setPrice(double price)
    {
        this.price = price;
    }

    public double getPrice()
    {
        return price;
    }

    public double setPrice()
    {
        Random random = new Random();
        this.price = random.nextInt(100000);
        return this.price;
    }

    public BasicCar clone() throws CloneNotSupportedException
    {
        return (BasicCar) super.clone();
    }
}

class Ford extends BasicCar
{
    public Ford(String name)
    {
        super.setModelName(name);
    }

    @Override
    public BasicCar clone() throws CloneNotSupportedException
    {
        return (Ford) super.clone();
    }
}

class Nano extends BasicCar
{
    public Nano(String name)
    {
        super.setModelName(name);
    }

    @Override
    public BasicCar clone() throws CloneNotSupportedException
    {
        return (Nano) super.clone();
    }
}

Note

  1. 当系统不关心创建对象的机制时,使用这个模式会有很大帮助
  2. 当我们需要在运行时新建对象的话可以使用这个模式
  3. 本例中使用的是Objectcopy()方法,属于浅拷贝,开销肯定比深拷贝小

优点:

  1. 运行时丢弃或者创建(include)对象
  2. 低成本创建对象

缺点:

  1. 每个子类都要实现clone机制
  2. 对于一些不能拷贝的对象或者有循环引用的对象,实现拷贝机制比较困难

思考

原型模式是为了节省新创建对象的开销,它的运行时创建删除对象特性我没搞懂,重新看过GoF再来补充

标签:BasicCar,setPrice,price,模式,bc1,原型,clone,public
来源: https://www.cnblogs.com/mouseGo/p/14118128.html