开局一张图,剩下全靠写…
设计模式文章集合:http://aphysia.cn/categories/designpattern
前言
接触过 Spring
或者 Springboot
的同学或许都了解, Bean
默认是单例的,也就是全局共用同一个对象,不会因为请求不同,使用不同的对象,这里我们不会讨论单例,前面已经讨论过单例模式的好处以及各种实现,有兴趣可以了解一下:http://aphysia.cn/archives/designpattern1。除了单例以外,Spring
还可以设置其他的作用域,也就是scope="prototype"
,这就是原型模式,每次来一个请求,都会新创建一个对象,这个对象就是按照原型实例创建的。
原型模式的定义
原型模式,也是创建型模式的一种,是指用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,简单来说,就是拷贝。一般适用于:
- 实例比较复杂,完全创建成本高,直接复制比较简单
- 构造函数比较复杂,创建可能产生很多不必要的对象
优点:
- 隐藏了创建实例的具体细节
- 创建对象效率比较高
- 如果一个对象大量相同的属性,只有少量需要特殊化的时候,可以直接用原型模式拷贝的对象,加以修改,就可以达到目的。
原型模式的实现方式
一般来说,原型模式就是用来复制对象的,那么复制对象必须有原型类,也就是Prototype
,Prototype
需要实现Cloneable
接口,实现这个接口才能被拷贝,再重写clone()
方法,还可以根据不同的类型来快速获取原型对象。
我们先定义一个原型类Fruit
:
public abstract class Fruit implements Cloneable{
String name;
float price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
@Override
public String toString() {
return "Fruit{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
以及拓展了Fruit
类的实体类Apple
,Pear
,Watermelon
:
public class Apple extends Fruit{
public Apple(float price){
name = "苹果";
this.price = price;
}
}
public class Pear extends Fruit{
public Pear(float price){
name = "雪梨";
this.price = price;
}
}
public class Watermelon extends Fruit{
public Watermelon