原型模式
作者:互联网
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
- 当系统不关心创建对象的机制时,使用这个模式会有很大帮助
- 当我们需要在运行时新建对象的话可以使用这个模式
- 本例中使用的是
Object
的copy()
方法,属于浅拷贝,开销肯定比深拷贝小
优点:
- 运行时丢弃或者创建(include)对象
- 低成本创建对象
缺点:
- 每个子类都要实现clone机制
- 对于一些不能拷贝的对象或者有循环引用的对象,实现拷贝机制比较困难
思考
原型模式是为了节省新创建对象的开销,它的运行时创建删除对象特性我没搞懂,重新看过GoF再来补充
标签:BasicCar,setPrice,price,模式,bc1,原型,clone,public 来源: https://www.cnblogs.com/mouseGo/p/14118128.html