目录
一、设计模式的六大设计原则
- 开闭原则(O):对扩展开放,对修改关闭。开闭原则是总原则,指尽量高度抽象,易扩展。
- 单一原则(S):一个类的接口抽象一个职责。
- 里氏替换原测(L):里氏替换是对开闭原则的补充,开闭原则为接口抽象,里氏替换则为接口的具体实现。
- 依赖倒置原则(D):面向接口编程,不跟具体实现类交互,跟接口交互。
- 接口隔离原则(I):每个接口的实现类必须是完全实现,如果说子类中存在不需要实现的方法,那么接口应该把这个方法拆分出去。
- 迪米特法则(D) :一个类对自己的依赖应该是知道的越少越好,只需要关注调用的public方法。
二、23种Java设计模式(具体介绍其中9个)
1、创建型模式(5种):用于创建对象,主要将对象的创建和使用分离
- 单例模式:某个类能生成一个实例,该类提供了一个全局访问点供外部获取该实例。
- 工厂方法模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
- 抽象工厂模式:提供一个创建产品的接口,其每个子类可以生产一系列相关的产品。
- 原型模式:将一个对象作为原型,通过对其复制而克隆出多个和原型类似的新实例。
- 建造者模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需求分别创建他们,最后构建成复杂对象。
工厂方法(FactoryMethod)
模式定义与特点: 只考虑生产同等级的产品,比如畜牧场只样动物,电视机厂只生产电视机。 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的"创建与使用相分离"的特点。
工厂方法的主要优点:
- 用户只需要知道具体工厂的名称就可得到所需要的产品,无须知道产品的具体创建过程;
- 在系统增加新的产品时,只需要添加具体产品类和对应的具体工厂类,无需对原工厂进行任何修改,满足开闭原则;
模式结构与实现:
工厂方法模式的主要角色如下:
1、抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂方法newProduct()来创建产品。
2、具体工厂:主要实现抽象工厂中的抽象方法,完成产品的具体创建。
3、抽象产品:定义了产品的规范,描述了产品的主要特征和功能。
4、具体产品:实现了抽象产品角色所定义的接口,有具体工厂来创建,它同具体工厂间一一对应。
//主方法
package FactoryMethod;
public class AbstractFactoryTest{
public static void main(String[] args){
try{
Product a;
AbstractFactory af;
af = (AbstractFactory)ReadXML1.getObject();
a = af.newProduct();
a.show();
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
//抽象产品:提供产品的接口
public interface Product{
public void show();
}
//具体产品:实现抽象产品中的抽象方法
public class ConcreteProduct1 implements Product{
public void show(){
System.out.println("具体产品1显示.....");
}
}
//抽象工厂:提供了工厂产品的生成方法
public interface AbstractFactory{
public Product newProduct();
}
//具体工厂1:实现了工厂产品的生成方法
public class ConcreteFactory implements AbstractFactory{
public Product newProduct(){
System.out.println("具体工厂1生成-->具体产品1");
return new ConcreteProduct1();
}
}
//具体工厂2:实现了工厂产品的生成方法
public class ConcreteFactory2 implements AbstractFactory{
public Product newProduct(){
System.out.println("具体工厂2生成-->具体产品2");
return new ConreteProduct2();
}
}
抽象工厂模式
模式定义与特点: 是一种为访问类提供一个创建一组相关或者相互依赖对象的接口,且访问类无须制定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
模式的结构与实现: 抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成,但是抽象工厂中方法个数不同,抽象产品的个数也不同。
//抽象工厂:提供了产品的生成方法
public interface AbstractFactory{
public Product1 newProduct1();
public Product2 newProduct2();
}
//具体工厂:实现了产品的生成方法
public class ConcreteFactory implements AbstractFactory{
public Product1 newProduct1();
public Product2 newProduct2();
}
//具体工厂:实现了产品的生成方法
public class ConcreteFactory implements AbstractFactory{
public Product1 newProduct1(){
System.out.println("具体工厂1生成 --> 具体产品 11...");
return new ConcreteProduct11();
}
public Product1 newProduct2(){
System.out.println("具体工厂1生成 --> 具体产品 11...");
return new ConcreteProduct21();
}
}
单例模式
在多线程环境下,能够保证一个类只产生一个对象。
public class Sington{
private static class SingtonHandler{
private static Sington instance = new Sington();
}
private Sington{}
public static getSington(){
return SingtonHandler.instance;
}
}
2、结构型模式(7种):用于描述类或者对象的组合方式
- 代理:为某个对象提供一种代理以控制对该对象的访问,即客户端通过代理间接的访问该对象,从而限制、增强或者修改该对象的一些特性。
- 适配器:将一个类的接口转换成客户端希望的另外一个接口
- 桥接:将抽象与现实分离,使他们可以独立变化,利用组合关系代替继承关系。
- 装饰:动态给对象加一些职责,即增加额外的功能。
- 外观:为多个复杂的子系统提供一个一致的接口,是这些子系统更加容易被访问。
- 享元:运用共享技术来有效地支持大量细粒度对象的复用。
- 组合:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问。
代理模式
模式定义与特点: 由于某些原因需要给某对象提供一个代理以控制该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问目标对象之间的中介。
代理模式的优点:
- 代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用
- 代理对象可以扩展目标对象的功能
- 代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度
代理模式的缺点:
- 在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢
- 增加了系统的复杂度
实现方式: 主要通过定义一个继承抽象主题的代理来包含真实主题,从而实现对真是主题的访问。
3、行为型模式(11种):
- 模板方法:定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重新定义该算法的某些特定步骤。
- 策略模式:定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的改变不会影响到使用算法的客户。
- 命令模式:将一个请求封装成一个对象,使发出请求的责任和执行请求的责任分开。
- 职责链:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
- 状态:允许一个对象在其内部状态发生改变时改变其行为能力。
- 观察者:多个对象间存在一对多的关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
- 中介者:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
- 迭代器:提供一种方法顺序访问聚合对象中的一系列数据,而不是暴露聚合对象的内部表示。
- 访问者:在不改变集合元素的前提下,为每一个集合中的每一个元素提供多种访问模式,即每个元素有多个访问者对象访问。
- 备忘录:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后回复它。
- 解释器:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。