目录
工厂模式(Factory Pattern)
所属:创建型模式,
适用时机:我们明确地计划不同条件下创建不同实例时。
实现
Java 工厂模式主要有三种形态:简单工厂模式(又称静态工厂模式)、工厂方法模式、抽象工厂模式。
简单工厂模式
实现方式:通过核心工厂类的静态方法,根据不同的参数来返回实现某一接口的不同类实例。
弊端:
- 拓展性差,维护、新增产品时,都必须修改核心工厂类。
- 如果产品之间存在复杂的层次关系,则工厂类必须拥有复杂的逻辑判断。
- 整个系统过于依赖核心工厂类。
示例
下面是定义的接口与其实现:
// 定义产品接口
interface Product {
}
// 定义安卓手机类
class Andriod implements Product {
public Andriod() {
System.out.println("安卓手机被创建!");
}
}
// 定义苹果手机类
class Iphone implements Product {
public Iphone() {
System.out.println("苹果手机被创建!");
}
}
接下来定义核心工厂类:
// 定义工厂类
class SimpleFactory {
public static Product factory(String className) {
if ("Andriod".equals(className)) {
return new Andriod();
} else if ("Iphone".equals(className)) {
return new Iphone();
} else {
return null;
}
}
}
最后即可通过不同参数来生成对应实例:
public class SimpleFactoryPatternDemo {
public static void main(String[] args) {
// 根据不同的产品生成产品
SimpleFactory.factory("Andriod");
SimpleFactory.factory("Iphone");
}
}
工厂方法模式
实现方式:为工厂类定义接口,用多态来削弱工厂类的职责。
特点:将简单工厂模式创建对象的职责,分担到子工厂类中,子工厂互相独立,互相不受影响。
局限:当面对有复杂的树形结构时,就必须为每个产品创建一个对应的工厂类,当到达一定数量就会出现类爆炸。
示例
修改简单工厂模式示例的核心工厂类 SimpleFactory 为:
// 定义工厂接口
interface Factory {
public Product create();
}
// 定义 Andriod 的工厂
class AndriodFactory implements Factory {
public Product create() {
return new Andriod();
}
}
// 定义 Iphone 的工厂
class IphoneFactory implements Factory {
public Product create() {
return new Iphone();
}
}
使用时,使用对应的工厂的 create 方法。
抽象工厂模式
适用时机:用于意在创建一系列互相关联或相互依赖的对象。
特点:在工厂方法基础上进行分类管理。
示例
// 定义 Andriod 接口
interface Andriod {
}
// 定义 Iphone 接口
interface Iphone {
}
// 定义安卓手机 - A 类
class AndriodA implements Andriod {
public AndriodA() {
System.out.println("安卓手机 - A 被创建!");
}
}
// 定义安卓手机 - B 类
class AndriodB implements Andriod {
public AndriodB() {
System.out.println("安卓手机 - B 被创建!");
}
}
// 定义苹果手机 - A 类
class IphoneA implements Iphone {
public IphoneA() {
System.out.println("苹果手机 - A 被创建!");
}
}
// 定义苹果手机 - B 类
class IphoneB implements Iphone {
public IphoneB() {
System.out.println("苹果手机 - A 被创建!");
}
}
核心工厂:
// 定义工厂
interface Factory {
public Andriod createAndriod();
public Iphone createIphone();
}
// 创建型号 A 的产品工厂
class FactoryA implements Factory {
public Andriod createAndriod() {
return new AndriodA();
}
public Iphone createIphone() {
return new IphoneA();
}
}
// 创建型号 B 的产品工厂
class FactoryB implements Factory {
public Andriod createAndriod() {
return new AndriodB();
}
public Iphone createIphone() {
return new IphoneB();
}
}
接下来,就可以根据不同型号,选择不同的工厂来创建实例。
参考
- [1] 千峰教育高校产品研发部.Java 语言程序设计[M].第2版.北京:清华大学出版社.2020.150~155