[lottery] 04_设计模式汇总

Android 4.0

设计模式汇总

l创建型模式
1、工厂模式
2、单例模式
l结构型模式
3、适配器模式
4、组合模式
l行为型模式
5、观察者模式
6、模版方法模式
l
1、工厂模式:主要用来解决层与层之间耦合性过高的问题①在工程目录下,新建source Folder,新建config.properties配置文件,用来保存映射关系
#UserService=cn.zengfanshegdesignMode.\u5DE5\u5382\u6A21\u5F0F.User1
UserService=cn.zengfanshegdesignMode.\u5DE5\u5382\u6A21\u5F0F.User2  
②写一个类BasicFactory.java用来加载config.properties配置文件和生产对象
package cn.zengfanshegdesignMode.工厂模式;
 
import java.io.IOException;
import java.util.Properties;
 
/**
* 工厂类
* @author hacket
*/

public class BasicFactory {
 
    // 1、加载config.properties文件
    private static Properties properties;
 
    static{
        properties = new Properties();
        try {
            properties.load(BasicFactory.class.getClassLoader().getResourceAsStream("config.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    //2、生产对象
    public static <T> T getInstance(Class<? extends T> clazz) {
 
        String simpleClassName = clazz.getSimpleName();
 
        try {
            Class<?> c = Class.forName(properties.getProperty(simpleClassName));
            @SuppressWarnings("unchecked")
            T t = (T) c.newInstance();
            return t;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
③抽取所有业务公共的业务方法,与用户相关的业务接口UserService.java,里面定义了和用户业务相关的方法
package cn.zengfanshegdesignMode.工厂模式;
/**
 * 用户业务的接口
 * @author hacket
 */
public interface UserService {
    /**
     * 用户登录
     */
    public abstract void login();
}
④具体的业务实现类
User1.java
package cn.zengfanshegdesignMode.工厂模式;
/**
 * 用户1
 * @author hacket
 */
public class User1 implements UserService {
    @Override
    public void login() {
        System.out.println("user1 login");
    }
}
User2.java
package cn.zengfanshegdesignMode.工厂模式;
/**
 * 用户2
 */
public class User2 implements UserService {
    @Override
    public void login() {
        System.out.println("user2 login");
    }
}
⑤如果在界面用调用业务中方法,不管业务中里面是如何变化,界面都不需要进行变化,只需要调用和用户业务的接口类就行了
package cn.zengfanshegdesignMode.test;
import org.junit.Test;
import cn.zengfanshegdesignMode.工厂模式.BasicFactory;
import cn.zengfanshegdesignMode.工厂模式.UserService;
public class FactoryTest {
    @Test
    public void testFactory() {
        UserService userService = BasicFactory.getInstance(UserService.class);
        userService.login();
    }
}
2、单例模式:保证一个类在内存中只有一个实例存在
①私有化构造器(防止外部new该类实例)
②一个私有的static成员变量
③一个公共的获取该类实例的方法
单例设计模式案例:
1、懒汉式—— LazySingleTon.java
package cn.zengfanshegdesignMode.单例;
/**
 * 懒汉式单例设计模式
 * @author hacket
 */
public class LazySingleTon {

    // note*********************0、懒汉式单例设计模式*********************
    // 特点:
    // 1、在类一个加载时,不创建本来对象实例,在使用的时候在创建本类的实例
    // 2、多线程中不安全
    // 3、面试中经常用到

    // note*********************1、单例解决的问题*********************
    // 保证该类在内存中只有一个对象实例

    // note*********************2、单例实现步骤*********************
    // 1、私有化构造器,保证外界不能new本类对象
    // 2、提供一个private,static的本类成员变量
    // 3、对外提供一个获取本类对象的实例的方法

    private LazySingleTon() {
    }
    private static LazySingleTon lazySingleTon = null;

//    有多线程安全问题
//    public static LazySingleTop getInstance() {
//
//        if (lazySingleTop == null) {// 有多线程安全,解决
//            try {
//                Thread.sleep(20);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            lazySingleTop = new LazySingleTop();
//        }
//        return lazySingleTop;
//    }

//    解决一:使用synchronized,效率低下,每次获取对象都需要进行锁判断
//    public static LazySingleTop getInstance() {
//        synchronized (LazySingleTop.class) {
//            try {
//                Thread.sleep(20);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            if (lazySingleTop == null) {
//                lazySingleTop = new LazySingleTop();
//            }
//            return lazySingleTop;
//        }
//    }

    // 解决二:双层判空,提升效率
    public static LazySingleTon getInstance() {
        if (lazySingleTon == null) {// 第一次判空,提高性能,主要用来防止每次进行synchronized,影响程序效率
            synchronized (LazySingleTon.class) {// ①
                try {
                    Thread.sleep(100);// 睡眠,增加错误机会
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (lazySingleTon == null) {// 这里要进行第二次判空,防止挂在一处的线程在唤醒的时候创建新的对象
                    lazySingleTon = new LazySingleTon();
                }
            }
        }
        return lazySingleTon;
    }
}
2、饿汉式—— HungrySingleTon.java
package cn.zengfanshegdesignMode.单例;
/**
 * 饿汉式单例设计模式
 * 
 * @author hacket
 */
public class HungrySingleTon {
    // note*********************0、饿汉式单例设计模式*********************
    // 特点:
    // 1、在类一个加载时,就创建本来对象
    // 2、多线程中安全
    // 3、在实际开发中常用

    // note*********************1、单例解决的问题*********************
    // 保证该类在内存中只有一个对象实例

    // note*********************2、单例实现步骤*********************
    // 1、私有化构造器,保证外界不能new本类对象
    // 2、提供一个private,static的本类成员变量
    // 3、对外提供一个获取本类对象的实例的方法

    private HungrySingleTon() {
    }
    private static HungrySingleTon singleTop = new HungrySingleTon();
    public static HungrySingleTon getInstance() {
        return singleTop;
    }
}
3、适配器模式 
作用:帮用户实现那些与具体操作没有多大关系的方法(在Android中常用)
如BaseAdapter和Adapter
Adapter中有10个抽象方法,而与用户操作相关的方法只有4个,BaseAdapter就是这个
4、组合模式 
(在Android中常用)
View和ViewGroup
5、观察者模式 
作用:观察某个对象的变化,在其数据变化的时候,通知其观察者
6、模版方法模式 
作用:抽取公有的操作,将变化的数据给抛出来