一.设计模式分类
1) 建设型模式
工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式
2) 结构型模式
适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式
3) 行为型模式
策略模式,模板方法模式,观察者模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介者模式,解释器模式
二.设计模式六大原则
1) 开闭原则
开闭原则就是对于扩展开放,对于修改关闭。在程序需要进行扩展时,不能去修改原有的代码,实现一个热插拔的效果
2)里氏代换原则
- 子类的能力必须大于等于父类的能力,即父类可以使用的方法,子类都可以使用。
- 返回值同理,假设父类方法返回一个 List ,那么子类应该返回一个 ArrayList 。如果父类返回一个 ArrayList,子类返回一个 List是不可以的,这时子类返回值的能力比父类小。
- 抛出异常情况同理,任何子类方法可以声明抛出父类方法声明异常的子类,而不能声明父类没有声明的异常。
3)依赖倒转原则
这是开闭原则的基础,即面向接口编程,依赖于抽象而不是依赖于具体实例。
4)接口隔离原则
使用多个隔离的接口,比使用单个接口要好,而且可以降低类之间的耦合度。即降低依赖,降低耦合。
5)迪米特法则(最少知道原则)
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6)合成复用原则
尽量使用合成/聚合的方式,而不是使用继承。
三.常见设计模式
工厂方法模式
现在需要创建几个对象,且这几个对象有共同的特征(实现了同一个接口的一些类),则不需要具体创建各个对象,而是创建对象的工厂类,通过工厂类实现对象的创建。
public interface Sender {
public void Send();
}
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
}
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
public class SendFactory {
public static Sender produceMail(){
return new MailSender();
}
public static Sender produceSms(){
return new SmsSender();
}
}
public class FactoryTest {
public static void main(String[] args) {
Sender sender = SendFactory.produceMail();
sender.Send();
}
}
抽象工厂模式
工厂方法模式有一个问题就是:类的创建依赖工厂类,对于程序的扩展(添加一个新的对象),就必须对工厂类进行修改,这违背了开闭原则。但是抽象工厂模式可以很好的解决上述问题。
public interface Provider {
public Sender produce();