1.单例模式Singleton
私有构造函数、私有静态变量、公有静态函数(用于获取对象实例)
a.最基本的:线程不安全
public class Single{
private static Single single;
private Singke(){
}
public static Single getSingle(){
if(single == null)
{
single = new Single();
}
return single;
}
}
b.推荐使用:串行化(synchronized)+双重校验是否初始化
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getUniqueInstance() {
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
PS:syn的三种应用方式
普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁
静态同步方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁
同步方法块,锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
第二个if不能省略,不然可能会被实例化多次
c.内部静态类实现:该方式由JVM保证线程安全性
1.内部静态类在没有被调用之前不会载入内存
2.静态类只能由JVM初始化一次
2.简单工厂模式
用户生命一个接口,然后调用工厂类决定接口的实例化
Product声明为接口
3.工厂模式
在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。
public abstract class Factory {
abstract public Product factoryMethod();
public void doSomething() {
Product product = factoryMethod();
// do something with the product
}
}
需要生命一个产生Product的抽象方法,通过抽象类实现多态
4.策略模式Strategy
策略模式可以让***算法***独立于使用它的客户端。
5.观察者模式Observer
观察者模式定义了主题对象和观察者对象之间的一对多依赖,当主题对象的状态发生变化时,它的所有依赖者对象都会收到通知并自动更新。
实际:一对多关联关系,但需要定义接口然后实现,以实现无需关注observer细节。
5.适配器模式adapter
Client: 客户,有请求
Adaptee :被适配者,所有的请求都委托给被适配者完成
Target: 目标抽象类,定义客户要用的请求接口
Adapter: 适配器,调用被适配者的接口,实现目标中 用户请求的接口
使用情况:1、使用第三方组件,而这个组件的接口与目前系统接口不兼容(如方法与系统方法不一致等),可以使用适配器模式解决接口不兼容问题。2、使用早前项目一些有用的类,可以用适配器模式解决现有接口与原有对象接口不兼容问题。