简单工厂
在工厂类中包含了必要的逻辑判断,用来封装对象的创建过程,降低了客户端与具体功能的耦合性
优点:
可以条件动态的实例化相关的类,
避免了直接实例化类,降低了耦合性
客户端不需要修改代码
缺点:
不符合OCP(开闭原则)的原则。当子类过多或者子类层次过多时不适合使用。
工厂方法
定义了一个创建对象的接口,但由子类来决定要实例化哪一个类; 使一个类的方法延迟到子类,即通过子类来创建对象。 克服了简单工厂模式违背 开发-封闭原则的缺点,有保持了封装对象创建过程的有点 适用场景: 需要生产多种、大量复杂对象的时候 需要降低耦合度的时候 当系统中的产品种类需要经常扩展的时候 优点: 每个具体产品都对应一个具体工厂类,不需要修改工厂类代码 工厂类可以不知道它所创建的对象的类 隐藏了对象创建的实现细节 缺点: 每增加一个具体产品类,就必须增加一个相应的具体工厂类
工厂方法模式 把 简单工厂模式 内部逻辑判断转移到了客户端的代码中。加功能时,本来是改工厂类的,而现在是修改客户端
抽象工厂
定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象。
适用场景:
系统要独立于产品的创建与组合时
强调一系列相关的产品对象的设计以便进行联合使用时
提供一个产品类库,想隐藏产品的具体实现时
优点:
将客户端与类的具体实现相分离
每个工厂创建了一个完整的产品系列,使得易于交换产品系列
有利于产品的一致性(即产品之间的约束关系)
缺点:
维护的类过多,扩展起来比较繁琐
相比工厂方法模式,抽象工厂模式中的每个具体工厂都生产一套产品。
即: 各产品系列有一个具体工厂类,然后在次基础上把工厂类在抽象一层,实现产品系列分离
建造者模式
将一个复杂对象的构建与他的表示分离,使得同样的创建过程可以创建不同的表示。
用户只需要指定建造的类型,就可以得到它们;其隐藏了产品的组装过程,用户无需关注建造的过程和细节
角色:
抽象建造者(Builder)
具体建造者(Concrete Builder)
指挥者(Director)
产品(Product)
适用场景:
当创建复杂对象的算法(Director)应该独立于该对象的组成部分以及它们的装配方式(Builder)时
当构造过程允许被构造的对象有不同的表示时(不同Builder)。
优点:
隐藏了一个产品的内部结构和装配过程
将构造代码与表示代码分开
可以对构造过程进行更精细的控制
原型模式
保证一个类只有一个实例,并提供一个访问它的全局访问点。
适用场景:
当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时
优点:
对唯一实例的受控访问
单例相当于全局变量,但防止了命名空间被污染
与单例模式功能相似的概念:全局变量、静态变量(方法)