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
原创粉丝点击