设计模式--简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(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、由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

浙公网安备 33010602011771号