做个笔记
引用
https://blog.csdn.net/lovelion/article/details/7424623
/**
*接口类
*/
interface OfficialDocument extends Cloneable{
public OfficialDocument clone();
public void display();
}
public class A implements OfficialDocument {
private String name;
private String content;
public A(String name,String content){
this.name = name;
this.content = content;
}
@Override
public OfficialDocument clone() {
Object obj = null;
try {
obj = super.clone();
return (A)obj;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
@Override
public void display() {
System.out.println("A++++++++++++");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "A{" +
"name='" + name + '\'' +
", content='" + content + '\'' +
'}';
}
}
/**
* 原型管理器
*/
public class PrototypeManager {
private HashMap<String,OfficialDocument> map = new HashMap();
//饿汉式
private static PrototypeManager pm = new PrototypeManager();
//私有构造器
private PrototypeManager(){
map.put("A",new A("ceshi","111"));
map.put("B",new B());
}
//公有获取对现象的方法
public static PrototypeManager getPm() {
return pm;
}
public void addOfficialDocument(String key,OfficialDocument doc){
map.put(key,doc);
}
//通过浅克隆获取新的公文对象
public OfficialDocument getOfficialDocument(String key){
return ((OfficialDocument)map.get(key)).clone();
}
//先查看是否有 没有放入map
public OfficialDocument getProto(Class<? extends OfficialDocument> type) {
if (map.get(type.getClass().getSimpleName()) == null) {
try {
map.put(type.getSimpleName(), type.newInstance());
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
System.out.println("getProto InstantiationException IllegalAccessException ... ");
}
}
return map.get(type.getSimpleName()).clone();
}
}
public class Test {
public static void main(String[] args) {
PrototypeManager prototypeManager = PrototypeManager.getPm();
// A a1= (A)prototypeManager.getProto(A.class);
// a1.setName("测试员");
// a1.setContent("测试第一个内容");
//
// A a2= (A)prototypeManager.getProto(a1.getClass());
// a2.setContent("测试第二个内容");
A a1= (A)prototypeManager.getOfficialDocument("A");
a1.setContent("测试第一个内容");
A a2= (A)prototypeManager.getOfficialDocument("A");
System.out.println(a1==a2);
System.out.println(a1.toString());
System.out.println(a2.toString());
}
}
结果
false
A{name=‘ceshi’, content=‘测试第一个内容’}
A{name=‘ceshi’, content=‘111’}
两个对象不相同 切name后面没有赋值是前一个带过来克隆的。