隐藏类的实例的创建细节,通过隐藏对象如何被创建实现模块独立
简单(静态)工厂模式
- 根据参数的不同返回不同类的实例
- 专门定义一个类来负责创建其他类,被创建类有共同的父类
- 模式结构
- factory
- product
- concreteProduct具体产品角色
- 一般应用:XML图形界面
- 缺点:工厂的职责过重,增加新产品需要修改工厂的判断逻辑(违背了开闭原则)
- 创建的对象较少,客户端只知道传输对象的名称
工厂方法模式
- 简单工厂模式的最大缺点是新产品加入要修改工厂类,违反开闭原则
- 工厂父类提供接口,工厂子类提供创建类的
- 模式结构
- product
- concreteProduct 具体产品
- factory 具体和抽象之间的类间关系是实现关系
- concreteFactory 具体工厂
- 工厂和产品之间是依赖关系
- 模式扩展
- 使用多个工厂方法
- 产品对象的重复使用
- 多态性的丧失和模式的退化
作业一:Java消息服务JMS(Java Message Service)
抽象工厂模式
- 产品等级结构:几种类型的产品
- 产品族:几种工厂
- 多个位于不同产品等级结构中属于不同类型的具体产品时属于使用工厂模式
- 提供一系列抽象接口
- 结构
- 抽象工厂
- 具体工厂
- 抽象产品
- 具体产品
- 增加工厂和产品族容易,但是增加产品的等级结构很难(纵向容易横向难)
- 增加产品族,添加一个工厂足以,但是增加一个产品的等级结构需要修改所有工厂
- 退化:当抽象工厂只有一个工厂,就退化成工厂模式
建造者模式
- 角色
- Bulider:抽象建造者
- 提供建造的接口
- Dirtector:指挥者
- 隔离了客户和生产的关系
- 控制生产的过程
- ConcreteBuilder:具体建造者
- Product:产品
- Bulider:抽象建造者
- 客户端不必知道产品内部组成的细节,相同的创建过程可以创建不同的产品
- 缺点:产品之间的差异如果很大不适合使用建造者
- 应用:游戏中的地图和人物
- 模式简化:省略建造者角色/省略指挥者
- 何时使用:一些基本部件不会变,而其组合经常变化的时候。
原型模式
- 动机:用原型实例指定创建对象的种类,通过复制这些原型创建新的对象
- 比如Java的Clone方法
- 深拷贝和浅拷贝
作业:java实现
KFC代码
邮件复制
单例模式
一个类只有一个实例,应用于整个系统中只需要拥有一个全局变量。
最常见的应用,配置类,配置文件读取在全系统只有一个实例即可。
实现
public class SingleObject {
//创建 SingleObject 的一个对象
private static SingleObject instance = new SingleObject();
//让构造函数为 private,这样该类就不会被实例化
private SingleObject(){}
//获取唯一可用的对象
public static SingleObject getInstance(){
return instance;
}
public void showMessage(){
System.out.println("Hello World!");
}
}构造函数私有化,然后在类内创建一个对象,并创建函数引用他。
调用时
//获取唯一可用的对象
SingleObject object = SingleObject.getInstance();