首页 > 代码库 > 设计模式之一 单例模式
设计模式之一 单例模式
单例模式的定义:
确保某一个类只有一个实例,而且自行实例化像整个系统提供这个实例。
单例模式通用类如下:
通用代码如下:
public class Singleon { //定义静态singleon private final static Singleon singleon = new Singleon(); /** * <p>Title: </p> * <p>Description: 不许外部调用构造函数</p> */ private Singleon() { } // 取得实例对象 public static Singleon getSingleon(){ return singleon; } //其他方法,尽量使static public static void doSomething(){ }}
单例模式优点:
1.内存中只有一个实例,减少内存开支。
2.避免对资源的多重占用,例如一个文件的书写动作
3.单例模式可以在系统设置全局的访问点,优化和共享资源访问。
单列模式使用的场景:
1. 要求生成唯一序列号的环境;
2. 在整个项目中需要一个共享访问点或共享数据。
3. 创建一个对象需要消耗的资源过多,如果要访问IO和数据库等资源;
4. 需要定义大量静态常量和静态方法(如工具类)的环境,可以采用单例模式
单例模式的注意事项
1.线程不安全
public class Singleon { //定义静态singleon private static Singleon singleon = null; /** * <p>Title: </p> * <p>Description: 不许外部调用构造函数</p> */ private Singleon() { } // 取得实例对象 public static Singleon getSingleon(){ if(singleon==null){ singleon = new Singleon(); } return singleon; } //其他方法,尽量使static public static void doSomething(){ }}
2.线程安全
public class Singleon { //定义静态singleon private static Singleon singleon = null; /** * <p>Title: </p> * <p>Description: 不许外部调用构造函数</p> */ private Singleon() { } // 取得实例对象 public static synchronized Singleon getSingleon(){ if(singleon==null){ singleon = new Singleon(); } return singleon; } //其他方法,尽量使static public static void doSomething(){ }}
单例模式的扩展
public class SingleonEx { //实例的数量 private static final int MAXNUM = 3; // 装载 SingleonEx private static ArrayList<SingleonEx> singleonLIst = new ArrayList<SingleonEx>(); // private static ArrayList<String> nameList = new ArrayList<String>(); // private static int iCount= 0; //初始化..... static{ for(int i=0;i<MAXNUM; i++){ singleonLIst.add(new SingleonEx("单例扩展:" + i )); } } /** * * <p>Title: </p> * <p>Description: 无参构造</p> */ private SingleonEx() { } /** * * <p>Title: </p> * <p>Description: 有参构造</p> * @param name */ private SingleonEx(String name){ nameList.add(name); } /** * * @Title: getInstance * @Description: 获取实例对象 * @param @return 设定文件 * @return SingleonEx 返回类型 * @throws */ public static SingleonEx getInstance() { //随机数.... Random rnd = new Random(); //随机产生一个 iCount=rnd.nextInt(MAXNUM); // return singleonLIst.get(iCount); } /** * * @Title: say * @Description: 测试使用打印点东西... * @param 设定文件 * @return void 返回类型 * @throws */ public static void say() { System.out.println(nameList.get(iCount)); } /** * * @Title: main * @Description: 入口测试用 * @param @param args 设定文件 * @return void 返回类型 * @throws */ public static void main(String[] args){ //定义测试5个 int iTest = 5; for(int i=0;i< iTest; i++){ SingleonEx sEx = SingleonEx.getInstance(); sEx.say(); } }}
设计模式之一 单例模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。