【通识】设计模式
1. 基础概念
设计模式是反复使用的、多数人知晓的、经过分类编写目的、代码设计经验的总价。使用是为了重用代码,让代码更容易被理解、保证可靠性。设计模式是多赢的,能使代码编制真正工程化,设计模式是软件工程的基石。
而序号和包括相关如下
1)设计模式间的关系包括以下
2)设计模式的六大原则
a. 开闭原则Open Close Principle:对扩展开放对修改关闭。在程序需要扩展的时候不去修改原有代码实现一个热插拔。
b. 里氏代换Liskov Substitution Principle:面向对象设计的基本原则之一。该原则提到,任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类能在基类的基础上增加新的行为。里氏代换原则则是对开闭原则的补充。实现开闭原则的关键步骤是抽象化,而基类和子类的继承关系是抽象化的具体实现,里氏代换原则则对实现抽象化的具体步骤的规范。
c. 依赖倒转Dependence Inversion Principle:针对接口编程依赖抽象而不依赖于具体
d. 接口隔离Interface Segregation Principle:使用多个隔离的接口比单个接口要好,还能降低类间的耦合度,降低依赖和耦合
e. 迪米特/最少知道原则Demeter Principle:一个实体应尽量少地与其他实体间发生相互作用,使系统功能模块相对独立
f. 合成复用原则Composite Reuse Principle:尽量使用合成/聚合的方式而非使用继承
1.1 工厂模式(Factory Pattern)
是Java中常用的设计模式之一,提供了创建对象的方式,使创建对象的过程和使用对象的过程分离。
类型 | 概念 |
---|---|
简单工厂模式(Simple Factory Pattern) | 简单工厂模式不是一个正式的设计模式,但它是工厂模式的基础。它使用一个单独的工厂类来创建不同的对象,根据传入的参数决定创建哪种类型的对象 |
工厂方法模式(Factory Method Pattern) | 工厂方法模式定义了一个创建对象的接口,但由子类决定实例化哪个类。工厂方法将对象的创建延迟到子类。 |
抽象工厂(Abstract Factory Pattern) | 抽象工厂模式提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。 |
- 概要:定义一个创建对象的接口让子类决定实例化哪个具体的类,使对象的创建过程延迟到子类。
- 主要解决的是接口选择的问题,适用于当我们需要在不同条件下创建不同实例时
- 应用实例包括汽车制造(需要制造汽车不关心内部汽车的制造过程和内部实现)和Hibernate(更换数据库时,只需更改方言dialect和数据库驱动driver)即可实现对不同数据库的切换
- 优点和缺点
4.1 优点
1)调用者知道对象的名称即可创建对象
2)扩展性高若增加新产品只需扩展一个工厂类即可
3)屏蔽了产品的具体实现,调用者只关心产品的接口
4.2 缺点
1)每增加一个产品时都要增加具体类和对应工厂,使系统类的数量成倍增加,增加了系统的复杂度和具体类的依赖 - 实现
- 案例
// 创建一个接口
public interface Shape {void draw();
}
// 创建实现接口的实体类
public class Rectangle implements Shpae {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}
// 另外一个
public class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}
}
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}
- 创建一个工厂,生成基于给定信息的实体类的对象
public class ShapeFactory {// 使用getShape方法获取形状类型的对象public Shape getShpe(String shapeType) {if(shapeType==null) return null;if(shapeType.equalsIgnoreCase("CIRCLE")) return new Circle;else if(shapeType.equalsIgnoreCase("RECTANGLE")) return new Rectangle;else if(shapeType.equalsIgnoreCase("SQUARE")) return new Square();}return null;
}
- 使用该工厂传递类型信息
public class FactoryPatternDemo {public static void main(String[] args) {ShapeFactory shapeFactory = new ShapeFactory();// 获取Circle对象并调用draw方法Shape shape1 = shapeFactory.getShape('CIRCLE');// 调用Circle的drawshape1.draw();// 获取Rectangle的对象并调用drawShpae shape2 = shapeFactory.getShape('RECTANGLE');// 调用Square的drawshape3.draw();}
}
1.2 抽象工厂模式(Abstract Factory Pattern)
- 围绕超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂,设计模式属于创建型模式,提供了创建对象的最佳方式。
- 在抽象工厂模式中接口负责创建一个相关对象的工厂不需要显示指定类,每个生成的工厂都能按工厂模式提供对象。
- 提供了一种创建一系列相关或相互依赖对象的接口而无需指定具体实现类,通过使用抽象工厂模式能将客户端和具体产品的创建过程解耦,使客户端通过工厂接口创建一族产品
- 抽象工厂模式包括几个主要角色
- 实现包括:创建Shape和Color接口和实现这些接口的实体类
- 具体步骤
// 为形状创建一个接口
public interface Shape {void draw();
}
// 创建实现接口的实体类
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}
// 方括号和圆形之类的
public class Square implements Shape {@Overridepublic void draw() {System.out.println("Inside Square::draw() method.");}
}
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}
- 为颜色创建一个接口
public interface Color {void fill();
}
// 创建接口的实体类
public class Red implements Color {@Overridepublic void fill() {System.out.println("Inside Red::fill() method.");}
}
public class Green implements Color {@Overridepublic void fill() {System.out.println("Inside Green::fill() method.");}
}
public class Blue implements Color {@Overridepublic void fill() {System.out.println("Inside Blue::fill() method.");}
}
- 为Color和Shape对象创建抽象类获取工厂
public abstract class AbstractFactory {public abstract Color getColor(String color);public abstract Shape getShape(String shape);
}
- 创建扩展了AbstractFactory工厂类基于给定信息生成实体类的对象
// shape工厂
public class ShapeFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType) {if(shapeType == null) return null;if(shapeType.equalsIgnoreCase('CIRCLE')) return new Circle();else if(shapeType.equalsIgnoreCase('RECTANGLE')) return new Rectangle();else if(shapeType.equalsIgnoreCase('SQUARE')) return new Square();}return null;
}
// color工厂
public class ColorFactory extends AbstractFactory {@Overridepublic Shape getShape(String shapeType){return null;}@Overridepublic Color getColor(String color) {if(color == null){return null;} if(color.equalsIgnoreCase("RED")){return new Red();} else if(color.equalsIgnoreCase("GREEN")){return new Green();} else if(color.equalsIgnoreCase("BLUE")){return new Blue();}return null;}
}
// 创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂
public class FactoryProducer {public static AbstractFactory getFactory(String choice) {if(choice.equalsIgnoreCase("SHAPE")) return new ShapeFactory();else if(choice.equalsIgnoreCase("COLOR")) return new ColorFactory();}return null;
}
使用FactoryProducer获取AbstractFactory通过传递类型信息获取实体类的对象
public class AbstractFactoryPatternDemo {public static void main(String[] args) {// 获取形状工厂AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");// 获取形状为circle的对象Shape shape1 = shapeFactory.getShape("CIRCLE");// 调用Circle的draw方法shape1.draw();// 获取形状Shape shape2 = shapeFactory.getShape("RECTANGEL");shape2.draw();// 获取形状为Square的对象Shape shape3 = shapeFactory.getShape(}
}