博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】单例模式
阅读量:6446 次
发布时间:2019-06-23

本文共 2428 字,大约阅读时间需要 8 分钟。

使用频率:★★★★☆

一、什么是单例模式

一个类只有一个全局实例

二、补充说明

一般把其构造方法设为私有,另外提供一个可以获取该实例的静态方法;

由于java存在反射机制,即使是私有构造方法,也能被外部创建,所以一般的写法严格来讲不属于单例模式;(ps:可以在构造方法内加个静态flag标志判断,保证其只能创建一次)

违背了“单一职责原则”,该类既是工厂又是产品(自己创建了自己);

单例模式可以改造成固定大小的多例模式;

三、角色

只有一个角色,就是单例;

四、Java例子

举几个常见的实用的例子

1、在类加载的时候生成对象(如生成该单例对象不耗资源的情况,可以考虑使用)

优点:线程安全;

缺点:不能达到(单例实例在第一次被使用时构建)的效果;

package com.pichen.dp.creationalpattern.singletonpattern.implement1;public class MyPrinter {    private static  MyPrinter myPrinter = new MyPrinter();    private MyPrinter(){        System.out.println("implements1: created a MyPrint instance.");    }    public static MyPrinter getInsatnce(){        return myPrinter;    }    public static void testPrint(){        MyPrinter.getInsatnce().print("hello!");    }    public void print(String str){        System.out.println(str);    }    }

2、单例实例在第一次被使用时构建(单线程环境使用)

优点:单例实例在第一次被使用时构建;

缺点:不加锁的话,存在线程安全问题,即使加了锁,对性能也产生了影响;

package com.pichen.dp.creationalpattern.singletonpattern.implement2;public class MyPrinter {    private static  MyPrinter myPrinter = null;    private MyPrinter(){        System.out.println("implements2: created a MyPrint instance.");    }    public static synchronized MyPrinter getInsatnce(){        if(null == myPrinter){            myPrinter = new MyPrinter();        }        return myPrinter;    }    public static void testPrint(){        System.out.println("hello!");    }    public void print(String str){        System.out.println(str);    }}

3、静态内部类(推荐使用)

优点:线程安全;单例实例在第一次被使用时构建;

缺点:暂无发现

package com.pichen.dp.creationalpattern.singletonpattern.implement3;public class MyPrinter {    private static class MyPrinterHolder {        private static MyPrinter instance = new MyPrinter();    }    private MyPrinter(){        System.out.println("implements3: created a MyPrint instance.");    }    public static  MyPrinter getInsatnce(){        return MyPrinterHolder.instance;    }         public static void testPrint(){        System.out.println("hello!");    }        public void print(String str){        System.out.println(str);    }    }

写个测试类如下,当我们没有显示的调用getInsatnce方法的时候,是不会生成单例对象的;

package com.pichen.dp.creationalpattern.singletonpattern.implement3;import com.pichen.dp.creationalpattern.singletonpattern.implement3.MyPrinter;public class Main {    public static void main(String[] args) {//        MyPrinter p = MyPrinter.getInsatnce();//        p.print("hello world.");        MyPrinter.testPrint();    }}

 打印结果:

hello!

 

转载地址:http://bbpwo.baihongyu.com/

你可能感兴趣的文章
hdu 3501 Calculation 2 (欧拉函数)
查看>>
可以免费下载视频素材和模板网站汇总
查看>>
生成包含数字和大小写字母的随机码
查看>>
Spring quartz 单机、集群+websocket集群实现文本、图片、声音、文件下载及推送、接收及显示...
查看>>
SPOJ104 Highways,跨越数
查看>>
使用rman备份异机恢复数据库
查看>>
Win7-64bit系统下安装mysql的ODBC驱动
查看>>
自己做一款简易的chrome扩展--清除页面广告
查看>>
node中非常重要的process对象,Child Process模块
查看>>
Webserver管理系列:3、Windows Update
查看>>
Linux内核源码详解——命令篇之iostat[zz]
查看>>
Sqlserver2000联系Oracle11G数据库进行实时数据的同步
查看>>
duplicate命令创建physical standby数据库报RMAN-03015 ORA-17628
查看>>
明年计划
查看>>
ORACLE功能GREATEST功能说明具体实例
查看>>
unity, particle play once and destroy
查看>>
hadoop job解决大数据量关联时数据倾斜的一种办法
查看>>
windows配置nginx实现负载均衡集群
查看>>
摄像机知识
查看>>
小tip:纯CSS让overflow:auto页面滚动条出现时不跳动
查看>>