原文来源于:程序员恰恰
如有侵权,联系删除
今天给大家介绍一下设计模式 - 简单工厂模式。
1. 含义
-
简单工厂模式又叫静态方法模式(因为工厂类定义了一个静态方法)
-
现实生活中,工厂是负责生产产品的;同样在设计模式中,简单工厂模式我们可以理解为负责生产对象的一个类,称为“工厂类”。
2. 解决的问题
将“类实例化的操作”与“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化出所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。
3. 模式原理
3.1 模式组成
3.2 UML类图
3.3 使用步骤
-
创建产品类 & 定义具体产品的公共接口;
-
创建具体产品类(实现产品类) & 定义生产的具体产品;
-
创建工厂类,通过创建静态方法根据传入不同参数从而创建不同具体产品类的实例;
-
外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
4. 实例
接下来我用一个实例来对简单工厂模式进行更深一步的介绍。
4.1 实例概况
-
背景:有一个生产工厂,要生产三款产品。
-
目的:最近推出了3个产品,希望使用简单工厂模式实现3款产品的生产
4.2 使用步骤
实现代码如下:
步骤1. 创建抽象产品类,定义具体产品的公共
public interface Product {
public abstract void Show();
}
步骤2. 创建具体产品类(继承抽象产品类),定义生产的具体产品
//具体产品类A
public class ProductA implements Product{
@Override
public void Show() {
System.out.println("生产出了产品A");
}
}
//具体产品类B
public class ProductB implements Product{
@Override
public void Show() {
System.out.println("生产出了产品B");
}
}
//具体产品类C
public class ProductC implements Product{
@Override
public void Show() {
System.out.println("生产出了产品C");
}
}
步骤3. 创建工厂类,通过创建静态方法从而根据传入不同参数创建不同具体产品类的实例
public class Factory {
public static Product Manufacture(String productName) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
// 工厂类里用switch语句控制生产哪种商品;
// 使用者只需要调用工厂类的静态方法就可以实现产品类的实例化。
switch (productName) {
case "A":
return new ProductA();
case "B":
return new ProductB();
case "C":
return new ProductC();
default:
return null;
}
}
}
进一步优化:一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂,于是,我们可以使用反射继续优化。
public class Factory {
public static Product Manufacture(String productName) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
// 工厂类里用switch语句控制生产哪种商品;
// 使用者只需要调用工厂类的静态方法就可以实现产品类的实例化。
// switch (productName) {
// case "A":
// return new ProductA();
// case "B":
// return new ProductB();
// case "C":
// return new ProductC();
// default:
// return null;
// }
Class<?> aClass = Class.forName(productName);
return (Product) aClass.newInstance();
}
}
步骤4. 外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例
public class SimpleFactoryPattern {
public static void main(String[] args) {
try {
Factory.Manufacture("com.it001.简单工厂设计模式_02.ProductA").Show();
Factory.Manufacture("com.it001.简单工厂设计模式_02.ProductB").Show();
Factory.Manufacture("com.it001.简单工厂设计模式_02.ProductC").Show();
} catch (Exception e) {
e.printStackTrace();
}
}
}
结果输出:
生产出了产品A
生产出了产品B
生产出了产品C
5. 优点
-
将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
-
把初始化实例时的工作放到工厂里进行,使代码更容易维护。更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。
6. 缺点
-
工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响;
-
简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。
7. 应用场景
在了解了优缺点后,我们知道了简单工厂模式的应用场景:
-
客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时;
-
当工厂类负责创建的对象(具体产品)比较少时。