Android设计模式笔记-单例模式、策略模式
来源:互联网 发布:河南科技学院网络教学 编辑:程序博客网 时间:2024/06/03 16:33
1.单例模式
单例模式确保某一个类只有一个实例,并且提供一个全局访问点。单例模式通过私有的构造方法,使得用户无法直接new实例对象。通过公共的静态方法,用户可以取得该类的实例。当一个对象要消耗过多资源的时候可以考虑使用单例模式。
特点
单例模式的实例在内存中只有一个,减少了内存开支。避免频繁的创建销毁对象,可以提高性能。避免对资源的多重占用。单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。
常用写法
public class Singleton { //一般方法线程不安全 private static Singleton mInstance = null; private Singleton() { } public void doSomething() { System.out.println("do sth."); } /*方式二 : double-check, 使用synchronized检查类型锁,避免并发时创建了多个实例。*/ public static Singleton getInstance() { if (mInstance == null) { synchronized (Singleton.class) { if (mInstance == null) { mInstance = new Singleton(); } } } return mInstance; } /*方式三 : 使用静态内部类持有实例。在第一次加载SingletonHolder时初始化一次mOnlyInstance对象, 保证唯一性, 也延迟了单例的实例化, 如果该单例比较耗资源可以使用这种模式.*/ public static Singleton getInstanceFromHolder() { return SingletonHolder.mOnlyInstance; } private static class SingletonHolder { private static final Singleton mOnlyInstance = new Singleton(); } /*方式四 : 注册到容器, 根据key获取对象.一般都会有多种相同属性类型的对象会注册到一个map中*/ private static Map<string singleton=""> objMap = new HashMap<string singleton="">(); /** * 注册对象到map中 * @param key * @param instance */ public static void registerService(String key, Singleton instance) { if (!objMap.containsKey(key) ) { objMap.put(key, instance) ; } } /** * 根据key获取对象 * @param key * @return */ public static Singleton getService(String key) { return objMap.get(key) ; }}
java的对象锁和类锁:java的对象锁和类锁在锁的概念上基本上和内置锁是一致的,但是,两个锁实际是有很大的区别的,对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。但是有一点必须注意的是,其实类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的.
2.策略模式
策略定义了一系列处理逻辑,针对同一类型操作,将复杂多样的处理方式分别开来,有选择的实现各自特有的操作。这使得处理逻辑可以独立于用户而独立的变化。
在策略模式中分为策略抽象、策略实现和策略执行三个角色。策略抽象一般是一个接口,策略实现及策略接口的具体实现。策略执行则是在上下文中具体策略的切换和执行。
使用场景
- 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
- 需要安全的封装多种同一类型的操作时。
- 出现同一抽象多个子类,而又需要使用if-else 或者 switch-case来选择时。
特点
- 结构清晰明了、使用简单直观。
- 耦合度较低,扩展方便。
- 随着策略的增加,子类也会变得繁多。
代码示例
//策略接口 public interface Strategy{ public double performing(double param1, double param2); } //加法策略 public class AddStrategy implements Strategy{ @Override public double performing(double param1, double param2) { return param1 + param2; } } //乘法策略 public class MultiStrategy implements Strategy{ @Override public double performing(double param1, double param2) { return param1*param2; } } //策略执行 public class Calc{ public double calc(Strategy calcStrategy,double param1, double param2){ return calcStrategy.performing(param1,param2); } }
0 0
- Android设计模式笔记-单例模式、策略模式
- Android 设计模式 笔记 - 单例模式
- C++设计模式--单例、策略模式
- Android 设计模式 笔记 - 策略模式
- Android 设计模式实战笔记 策略模式
- Android开发----几大设计模式(单例模式、Builder模式、观察者模式、原型模式、策略模式)
- 设计模式之单例、策略模式、代理模式
- 设计模式(策略模式,单例模式)
- javascript设计模式(一)单例模式 策略模式
- 《Android学习笔记》Android设计模式之单例模式
- 设计模式笔记--策略模式
- 设计模式笔记-策略模式
- 设计模式笔记--策略模式
- 设计模式笔记:策略模式
- Android设计模式学习笔记(单例模式)
- android设计模式-策略模式
- [Android] 设计模式-策略模式
- Android设计模式-策略模式
- android string.xml 中显示特殊符号
- 敌机飞机的添加
- Win7(WinDbg) + VMware(Win7) 双机调试环境搭建之四
- iOS 常用公共方法(一)
- Android 使用JmDNS查找和注册设备
- Android设计模式笔记-单例模式、策略模式
- Unity3d简单的资源管理器
- Java web复习要点
- 剑指offer题解 数字在排序数组中出现的次数
- iptables网页劫持重定向
- 第十六周上机实践——项目5-二进制文件浏览器
- 沟通的艺术——情绪:感觉、思考和沟通
- java WEB 配置文件的读取
- 1066. Root of AVL Tree