简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
我们以打印不同银行的卡余额为例:
在没有引用任何设计模式之前,代码示例如下:
/** 农业银行业务类 * @description: * @author: jack * @time: 2022/5/10 19:41 */ public class AbcBank { public void getBalance() { System.out.println("您的农业银行余额为1000元."); } }
/** 建设银行业务类 * @description: * @author: jack * @time: 2022/5/10 19:43 */ public class CcbBank { public void getBalance() { System.out.println("您的建设银行余额为2000元."); } }
/** * @description: 简单工厂模式实现 * @author: jack * @time: 2022/5/10 19:38 */ public class SimpleFactoryPatternDemo { public static void main(String[] args) { getBalance("ccb"); } public static void getBalance(String bankName) { if("abc".equals(bankName)){ AbcBank abcBank = new AbcBank(); abcBank.getBalance(); } else if("ccb".equals(bankName)){ CcbBank ccbBank = new CcbBank(); ccbBank.getBalance(); } } }
在这里我们可以看到,分别创建了AbcBank农业银行业务类、CcbBank建设银行业务类,以及具体main方法实现:
执行getBalance("abc")方法,打印:您的农业银行余额为1000元.
执行getBalance("ccb")方法,打印:您的建设银行余额为2000元.
在使用简单工厂方法之后代码调整如下:
首先我们抽象出银行类Bank.java
/** * @description: 银行的抽象类 * @author: jack * @time: 2022/5/10 20:00 */ public abstract class Bank { public abstract void getBalance(); }
农业银行和建设银行类分别集成银行基类
/** 农业银行业务类 * @description: * @author: jack * @time: 2022/5/10 19:41 */ public class AbcBank extends Bank{ @Override public void getBalance() { System.out.println("您的农业银行余额为1000元."); } }
/** 建设银行业务类 * @description: * @author: jack * @time: 2022/5/10 19:43 */ public class CcbBank extends Bank{ @Override public void getBalance() { System.out.println("您的建设银行余额为2000元."); } }
我们把创建不同银行的实例交给银行工厂(静态)BankFactory
/** * @description: 银行工厂 * @author: jack * @time: 2022/5/10 19:59 */ public class BankFactory { /** * 根据不同参数创建不同银行业务类 * @param bankName * @return */ public static Bank createBank(String bankName) { Bank bank = null; switch (bankName) { case "abc": bank = new AbcBank(); break; case "ccb": bank = new CcbBank(); break; } return bank; } }
下面我们根据不同的业务参数实现打印不同银行的余额:
/** * @description: 简单工厂模式实现 * @author: jack * @time: 2022/5/10 19:38 */ public class SimpleFactoryPatternDemo { public static void main(String[] args) { // 创建农行工厂,实现打印农业银行余额 Bank abcBank = BankFactory.createBank("abc"); abcBank.getBalance(); // 创建建行工厂,实现打印建设银行余额 Bank ccbBank = BankFactory.createBank("ccb"); ccbBank.getBalance(); } }
打印结果:
您的农业银行余额为1000元.
您的建设银行余额为2000元.
简单工厂的UML实例图:
通过以上示例我们可以看出,在原有 if..else...的简单代码堆积的基础上进行了封装,把创建实例和业务实现进行分开,实例的创建交给工厂来创建
使用简单工厂模式的优点和缺点
优点:
1、实现 ‘生产’ 和 ‘消费’ 完全分开
2、对象的创建和使用相互分离,客户端不需要关心具体创建哪种实例,只需要传入参数工厂会自动创建对应的实例
缺点:
1、违背了开闭原则,当需要新加入实例时,需要修改工厂内部代码。
2、由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。