您现在的位置是:首页 > 正文

原型模式-学习设计模式

2024-04-01 02:24:18阅读 0

做个笔记
引用
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后面没有赋值是前一个带过来克隆的。

网站文章

  • python之生成器、迭代器

    python之生成器、迭代器

    python之生成器、迭代器一、生成器创建生成器的方法二、迭代器一、生成器使用列表推导的前提是将所有数据都存入内存,若是数据特别大,则内存消耗会很大,使用生成器可以在循环遍历列表的时候动态生成下一个元...

    2024-04-01 02:23:36
  • php版canvas,HTML5 Canvas

    php版canvas,HTML5 Canvas

    canvas 元素用于在网页上绘制图形。什么是 Canvas?HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。 (推荐学习:html教程)画布是一个矩形区域,您可以控制...

    2024-04-01 02:23:28
  • 在Linux下交叉编译生成windows程序

    在Ubuntu环境下,利用mingw32,交叉编译windows程序,以便在windows下运行。

    2024-04-01 02:23:21
  • 【深度学习】ubuntu系统指定gcc版本并调整优先级

    【深度学习】ubuntu系统指定gcc版本并调整优先级

    sudo apt install build-essential gcc --version (查看gcc版本)可以看到我的gcc版本是4.8.5 安装最新版gcc9 sudo apt install...

    2024-04-01 02:23:14
  • java中什么是互斥,什么是Java中的互斥和信号量? 主要区别是什么?

    信号量可以被计数,而互斥量只能算到1。假设你有一个接受客户端连接的线程正在运行。 这个线程可以同时处理10个客户端。 然后每个新的客户端设置信号量,直到它达到10.当信号量有10个标志,那么你的线程将...

    2024-04-01 02:22:25
  • 华为p50鸿蒙os1020,鸿蒙OS+液态镜头+麒麟1020华为P50,华为P30即将悲惨让路价崩

    华为p50鸿蒙os1020,鸿蒙OS+液态镜头+麒麟1020华为P50,华为P30即将悲惨让路价崩

    原标题:鸿蒙OS+液态镜头+麒麟1020华为P50,华为P30即将悲惨让路价崩鸿蒙OS+液态镜头+麒麟1020华为P50,华为P30即将悲惨让路价崩据最新消息,华为P50系列有可能采用“液态镜头”,这...

    2024-04-01 02:22:17
  • 麒麟子Cocos Creator实用技巧一:如何正确地显示微信头像

    麒麟子Cocos Creator实用技巧一:如何正确地显示微信头像

    不管是游戏App,还是H5,又或者是微信小游戏。但凡接入了微信登录的应用,都可能需要显示微信头像。在Cocos Creator中,我们常见的显示方法像下面这样var headimg = 'http://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83erD6MOUwRKV9NyBAqnoFDTnltzAe2zWOkKxyDOFibVBb1ZV5CaATJw...

    2024-04-01 02:21:28
  • 分享各大OJ平台,干货满满

    以下是各大OJ平台,找到适合自己的才能达到事半功倍的效果,白嫖! 1.浙江大学 Online Judge(ZOJ) 链接:http://acm.zju.edu.cn 国内最早也是最有名气的OJ,有很多...

    2024-04-01 02:21:20
  • 08.音频系统:第004课_Android音频系统详解:第002节_以例子说明几个重要概念

    08.音频系统:第004课_Android音频系统详解:第002节_以例子说明几个重要概念

    该小节我们以几个例子,说明几个重要的概念:stream type, strategy, device, output, profile, module : policy,out flag 我们先画一个...

    2024-04-01 02:21:04
  • 病毒基础:文件加密(Windows文件与目录操作练习)

    病毒基础:文件加密(Windows文件与目录操作练习)

    我们知道有很多病毒都是对我们系统的文件做了一些手脚,我们上一篇文章学习了如何对Windows下的文件和目录操作,现在我们写一个小练习:遍历指定目录,循环加密文件内容:这边建议大家还是在虚拟机上做实验,万一一不小心就将系统文件给打乱了。

    2024-04-01 02:20:25