Android设计模式笔记-单例模式、策略模式

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值