一、概述
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,属于创建型模式。
它提供了一种创建对象的最佳方式,即将对象的实例化过程封装在工厂类中,这样做的好处就是可以将对象的创建与使用进行分离,创建对象的过程不对客户暴露,通过使用一个公共的接口来指向新创建的对象。
简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method)。
二、模块
- Factory:工厂类是工厂模式的核心,它负责创建所有实例,也就是构建具体产品的对象,用来创建产品对象的方法一般为静态方法。
- AbstractProduct:抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
- Product:具体产品类,是简单工厂模式的创建目标
三、示例
假如有一个酒水加工厂,主要生产酒、饮料、矿泉水,这个过程我们就可以使用简单工厂模式。
四、代码
第一步:首先创建产品基类,也就是抽象产品类。
/*
* 抽象产品类
*/
public abstract class Product {
// 获取产品
public abstract void getProduct();
}
第二步:创建具体产品类,都继承抽象产品类。
/**
* 具体产品类
*
*/
public class Water extends Product {
@Override
public void getProduct() {
System.out.println("矿泉水");
}
/**
* 具体产品类
*/
public class Drinks extends Product {
@Override
public void getProduct() {
System.out.println("饮料");
}
}
/**
* 具体产品类
*/
public class Wine extends Product {
@Override
public void getProduct() {
System.out.println("茅子");
}
}
第三步:创建工厂类,以及静态方法,用来实例化具体产品对象。
/**
* 工厂类 用来实例化具体产品类
* 根据type的不同创建不同的对象
*/
public class Factory {
public static Product createProduct(String type) {
Product product = null;
switch (type) {
case "drink":
product = new Drinks();
break;
case "water":
product = new Water();
break;
case "wine":
product = new Wine();
break;
}
return product;
}
}
五、测试
/**
- 测试类
*/
public class SimpleFactoryDemoTest {
public static void main(String[] args) {
Factory.createProduct("water").getProduct();
Factory.createProduct("drink").getProduct();
Factory.createProduct("wine").getProduct();
}
}
六、思考总结
优点:
- 该模式下,工厂类中根据必要的判断逻辑,创建对应产品的实例,使得客户端只需要关心使用对应的产品,无需关注对象的创建,实现了责任分割。
- 其次,客户端也无需知道创建的具体实例化对象,只需要知道简单的数据参数,就可以进行调用。
缺点:
- 这种模式下,一旦工厂类不能正常工作,整个系统都会受到影响。
- 其次,每增加一种要生产的商品,就需要新加一个具体产品的实现类,同时也需要修改创建实例化的静态方法,不符合开闭原则(开放扩展关闭修改)。
- 同时也会增加系统中类的个数,一定程度上增加了系统的复杂度和理解难度。