定义
用于创建重复对象,属于创建型模式。
应用场景
当代码不应该依赖于需要复制的对象的具体类时
优点
1.避免重复初始化对象 2.方便复制对象 3.提高性能
缺点
对象需要实现Cloneable接口。
具体实现
抽象类
package com.elaine.testpattern.prototype;
/**
* 颜色抽象类
* <p>
* author: elaine
* date: 2021/4/30
*/
public abstract class Color implements Cloneable {
private int id;
protected String type;
abstract void fill();
public String getType() {
return type;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Object clone() {
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return object;
}
}
具体类
红色对象
package com.elaine.testpattern.prototype;
import android.util.Log;
/**
* 红色
* author: elaine
* date: 2021/4/30
*/
public class RedColor extends Color {
public RedColor() {
type = "red";
}
@Override
void fill() {
Log.e("color====", "fill=====red");
}
}
绿色对象
package com.elaine.testpattern.prototype;
import android.util.Log;
/**
* 绿色
* author: elaine
* date: 2021/4/30
*/
public class GreenColor extends Color {
public GreenColor() {
type = "green";
}
@Override
void fill() {
Log.e("color====", "fill=====green");
}
}
白色对象
package com.elaine.testpattern.prototype;
import android.util.Log;
/**
* 白色
* author: elaine
* date: 2021/4/30
*/
public class WhiteColor extends Color {
public WhiteColor() {
type = "white";
}
@Override
void fill() {
Log.e("color====", "fill=====white");
}
}
缓存管理
package com.elaine.testpattern.prototype;
import java.util.Hashtable;
/**
* 颜色缓存
* author: elaine
* date: 2021/4/30
*/
public class ColorCache {
private static Hashtable<Integer, Color> colorHashtable = new Hashtable<>();
public static Color getColor(int id) {
Color color = colorHashtable.get(id);
return (Color) color.clone();
}
public static void loadCache() {
RedColor redColor = new RedColor();
redColor.setId(1);
colorHashtable.put(redColor.getId(), redColor);
GreenColor greenColor = new GreenColor();
greenColor.setId(2);
colorHashtable.put(greenColor.getId(), greenColor);
WhiteColor whiteColor = new WhiteColor();
whiteColor.setId(3);
colorHashtable.put(whiteColor.getId(), whiteColor);
}
}
运行代码
private void use() {
ColorCache.loadCache();
Color red = ColorCache.getColor(1);
red.fill();
Log.e("color===", red.getType());
Color green = ColorCache.getColor(2);
green.fill();
Log.e("color===", green.getType());
Color white = ColorCache.getColor(3);
white.fill();
Log.e("color===", white.getType());
}