<<单例设计模式>>--黑马程序员
2013-09-05 11:58
537 查看
--------------------- ASP.Net+Android+IOS开发
. .Net培训.-----------期待与您交流! -----------------
这里有是:老外怎样向妻子介绍设计模式的: 请点击 有利于我们进一步的理解设计模式。下面就是几个简单的设计模式。
2.在本类(Single)中实例化一个对象----为了可以操作本类的中的成员
3.在本类中提供一个方法,返回在本类中实例化的对象----为了可以在其他类(Other)可以获得此对象,对本类进行操作。
如果是这样的话,那么就能够这样设置Single.s=null;那么就会把单例中的对象暴露出来了,这样就不安全了,如果这样设置的话,那么就相当于给其对象设置了set方法!所以我们要杜绝这样设计!
---------------------- ASP.Net+Android+IOS开发
. .Net培训.-----------期待与您交流! -------------------
. .Net培训.-----------期待与您交流! -----------------
1. 设计模式的理解:
解决某一类问题最行之有效的方法。这里有是:老外怎样向妻子介绍设计模式的: 请点击 有利于我们进一步的理解设计模式。下面就是几个简单的设计模式。
2. 单例设计模式。
我的理解:单例就是一个对象或者说是有有限的对象,避免其他的程序可以过多的创建此对象,这样就可以操作特定的对象形成统一的现象。所有对象都共享同样的信息,就定义成单例模式。便于管理,安全。2-1.单例模式的实现步骤。
1.将本类(Single)的构造方法私有化-----为了防止其他的类(Other)可以创建此类(Single)对象。2.在本类(Single)中实例化一个对象----为了可以操作本类的中的成员
3.在本类中提供一个方法,返回在本类中实例化的对象----为了可以在其他类(Other)可以获得此对象,对本类进行操作。
2-2.单例模式注意事项。
将在本类中定义对象定义成静态的(static)-------因为在其他类中不是实例化本类(Single),所以必须通过类名调用获取本类的对象的方法,所以方法是静态的,因为静态方法只能调用静态成员,所以要将实例化的对象定义成静态的。2-3.单例模式:懒汉式和饿汉式。
便于理解的记忆方法:饿汉式就是一个人非常饿,所以他进来就吃(就是先实例化),懒汉式就是一个人非常懒,那么他什么时候饿什么时候才做,才吃(就是后实例化,就是什么时候用到,什么时候实例化)1.饿汉式----模式代码
饿汉式就是先实例,只要是类一加载,那么次对象就存在。public class Single { private static Single s = new Single(); private Single() {} public static Single getInstance() { return s; } } public class SingleDemo { public static void main(String[] args) { Single ss=Single.getInstance(); } }
2.懒汉式----模式代码
类一加载,不会先实例,首先是空值,在调用返回对象的方法中实例,一调用方法实例对象才存在。public class ESingle { private static ESingle s=null; private ESingle(){} public static ESingle getInstance(){ if(s==null){ s=new ESingle(); } return s; } } public class SingleDemo { public static void main(String[] args) { ESingle s1=ESingle.getInstance(); } }
3.下面举一个设置颜色的例子
public class Single { private static Single s = new Single(); private String color="灰色"; private Single() {} public static Single getInstance() { return s; } public static Single getS() { return s; } public static void setS(Single s) { Single.s = s; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } } public class SingleDemo { public static void main(String[] args) { Single s1=Single.getInstance(); Single s2=Single.getInstance(); System.out.println("s1------"+s1.getColor()); s2.setColor("红色"); System.out.println("s1------"+s1.getColor()); System.out.println("s2------"+s2.getColor()); } }
结果: s1------灰色 s1------红色 s2------红色 从结果中可以看出,只要是本类的对象,在设置颜色后,只要是本类的对象,他们都会同时改变,这就是单例模式的特点。 |
4.结构加载顺序图。
5.懒汉式的增加安全性。
public class ESingle { private static ESingle s = null; private ESingle() { } public static ESingle getInstance() { if (s == null) { synchronized (ESingle.class) { if (s == null) s = new ESingle(); } } return s; } }
这样就增加了懒汉式的安全性,在以后的开发中,饿汉式用的比较多,这样加上锁后,增加安全性,判断次数也比较少,那么效率也不会变小。先判断,然后判断进锁。 |
6. 疑问:
那为什么把实例化的对象定义成公有的且静态的,这样就可以不用使用方法来返回,这样也可以防止多线程出现异常,就可以用类名直接调用了。这样不就更方便呢啊!public class Single { public static Single s = new Single(); private Single() {} } public class SingleDemo { public static void main(String[] args) { Single s1=Single.s; } }
如果是这样的话,那么就能够这样设置Single.s=null;那么就会把单例中的对象暴露出来了,这样就不安全了,如果这样设置的话,那么就相当于给其对象设置了set方法!所以我们要杜绝这样设计!
---------------------- ASP.Net+Android+IOS开发
. .Net培训.-----------期待与您交流! -------------------
相关文章推荐
- <C/C++ 版> 设计模式 学习之 工厂模式 <2>
- <设计模式>系列汇总 By python and C++
- <C/C++ 版> 设计模式 学习之 工厂模式 <1>
- 黑马程序员 Java(三)>单例设计模式<
- <Android>设计模式的工厂模式(待补充)
- <C/C++ 版> 设计模式 学习之 策略模式+工厂模式
- 黑马程序员_<<装饰设计模式>>
- <C/C++ 版> 设计模式 学习之 策略模式
- <转载> 设计模式精解c++-GoF 23 种设计模式解析
- <C++ 实现设计模式> 观察者模式
- <C++ 实现设计模式> 观察者模式
- <转载>常见的23种设计模式
- &lt;org manual&gt;翻译--2.11 名为Orgstruct的minior模式
- (Boolan)C++设计模式 <三> ——策略模式(Strategy)
- 设计模式学习之抽象工厂模式(二)<反射+配置文件>
- <黑马程序员>---java基础---多线程知识
- <响应式布局>5---设计流程
- JAVA设计模式(2) —<创建型>抽象工厂模式(Abstract Factory)
- <div+css页面布局课堂笔记>8---页面浮动设计
- (Boolan)C++设计模式 <四> ——观察者模式(Observer)