介绍
原型模式用于创建重复的对象,又能保证性能。当创建一个对象代价比较大时,可以使用这种模式。
实际使用中原型模式很少单独出现,通常与工厂方法模式一起使用,工厂方法将创建的对象缓存起来,等下次需要再创建这种对象时,使用clone()方法克隆一个对象提供给使用者。
clone出来的对象与原对象是两个不同的实例对象。
主要优点:
-
可以高性能的创建重复的对象
-
规避构造函数的约束
实现
实现java.lang.Cloneable接口,重写clone()方法。
工厂模式+原型模型
class SimpleDriverFactory{
private static Map<String, Driver> cache = new ConcurrentHashMap<>();
private final static String ORACLE = "Oracle";
private final static String MYSQL = "Mysql";
public static Driver createDriver(String driverType) throws CloneNotSupportedException {
loadCache();
Driver driver = null;
switch (driverType){
case ORACLE:
OracleDriver oracleDriver = (OracleDriver) cache.get(ORACLE);
driver = oracleDriver.clone();
break;
case MYSQL:
MysqlDriver mysqlDriver = (MysqlDriver) cache.get(MYSQL);
driver = mysqlDriver.clone();
break;
default:
driver = null;
}
return driver;
}
private static void loadCache(){
if(!cache.containsKey(ORACLE)){
OracleDriver driver = new OracleDriver();
driver.setName("Oracle");
cache.put(ORACLE, driver);
}
if(!cache.containsKey(MYSQL)){
MysqlDriver driver = new MysqlDriver();
driver.setName("Mysql");
cache.put(MYSQL, driver);
}
}
}
实现Cloneable接口,重写clone()方法
class MysqlDriver implements Driver, Cloneable{
@Override
public void connect() {
System.out.println("Mysql连接");
}
@Override
public MysqlDriver clone() throws CloneNotSupportedException {
return (MysqlDriver) super.clone();
}
}
class OracleDriver implements Driver, Cloneable{
@Override
public void connect() {
System.out.println("Oracle连接");
}
@Override
public OracleDriver clone() throws CloneNotSupportedException {
return (OracleDriver) super.clone();
}
}
使用
public static void main(String[] args) throws CloneNotSupportedException {
Driver oracleDriver = SimpleDriverFactory.createDriver("Oracle");
oracleDriver.connect();
//第二遍走clone()
Driver oracleDriver1 = SimpleDriverFactory.createDriver("Oracle");
oracleDriver1.connect();
}
源码应用
org.springframework.beans.factory.support.AbstractBeanDefinition
注意
更多关于Clone方法的使用请查看Clone方法与浅拷贝&深拷贝