设计模式汇总
l创建型模式
•
l结构型模式
•
l行为型模式
•
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配置文件和生产对象
③抽取所有业务公共的业务方法,与用户相关的业务接口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.javapackage 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、模版方法模式 作用:抽取公有的操作,将变化的数据给抛出来 |