设计模式:
1. 简单工厂模式:又叫做静态工厂方法模式。是由一个工厂类根据传入的参量决定创建出
哪一种产品类的实例。一般涉及到三种角色:
1)工厂类角色:这是本模式核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
2)抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3)具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
2. 工厂方法模式:又称多态性工厂方法模式。它去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承,由其子类决定要实例化的类是哪一个。涉及四种角色:
1)抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2) 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
3. 抽象工厂模式:又称工具箱模式。提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。涉及四种角色(同工厂方法角色一样):‘
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象方法模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
4. 单例模式:保证一个类中仅有一个实例,并提供一个访问它的全局访问点。
public class Singleton {
//在自己内部定义自己一个实例,注意这是private 只供内部调用
private static Singleton instance = new Singleton() ;
//如上面所述,将构造函数设置为私有
private Singleton(){}
//静态工厂方法,提供了一个供外部访问得到对象的静态方法
public static Singleton getInstance() {
return instance;
}
}
下面这种方式被称为懒汉式:P
public class Singleton {
//和上面有什么不同?
private static Singleton instance = null;
//设置为私有的构造函数
private Singleton(){}
//静态工厂方法
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进
if (instance==null)
instance=new Singleton();
return instance;
}
}
5. 代理模式:为其他对象提供一种代理以控制对这个对象的访问。涉及三种角色:
1) 抽象主题角色:声明了真实主题和代理主题的共同接口。
2) 代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口。
3) 真实主题角色:定义真实的对象。
6. 观察者(Observer)模式:定义对象之间的一种一对多依赖关系,当一个对象改变状态时,所有依赖它的对象都会收到通知并自动更新。
例如:报纸订阅服务,出版社和订阅者可以比拟这一切(报纸更新会通知订阅者)。
涉及四种角色:
1) 抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一
个目标。并且提供注册和删除观察者对象的接口。目标角色往往由抽象类或者接口来实现。
2) 抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个
更新接口。抽象观察者角色主要由抽象类或者接口来实现。
3) 具体目标角色(Concrete Subject):将有关状态存入各个Concrete Observer 对象。当
它的状态发生改变时, 向它的各个观察者发出通知。
4) 具体观察者角色(Concrete Observer):存储有关状态,这些状态应与目标的状态保持
一致。实现Observer 的更新接口以使自身状态与目标的状态保持一致。在本角色内也可以维护一个指向Concrete Subject 对象的引用。
7. 策略模式:属于对象行为型设计模式,定义算法族,分别封装成拥有共同接口的单独的类,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
涉及三种角色:
1) 算法使用环境(Context)角色:算法被引用到这里和一些其它的与环境有关的操作一起
来完成任务。
2) 抽象策略(Strategy)角色:规定了所有具体策略角色所需的接口。在java 它通常由接口
或者抽象类来实现。
3) 具体策略(Concrete Strategy)角色:实现了抽象策略角色定义的接口。
8. 装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。涉及四种角色:
1) 抽象构件角色(Component):定义一个抽象接口,以规范准备接收附加责任的对象。
2) 具体构件角色(Concrete Component):这是被装饰者,定义一个将要被装饰增加功能的类。
3) 装饰角色(Decorator):持有一个构件对象的实例,并定义了抽象构件定义的接口。
4) 具体装饰角色(Concrete Decorator):负责给构件添加增加的功能。