内容简介:简单工厂模式(简单工厂包含了一下角色:简单工厂应用的场景比较对,那么就根据作者的理解,拿作者工作中遇到的场景需求举例: 平台做一个机票代购业务,对接了两个供应商A、B,用户选择完机票后,平台拿着机票去供应商下单。下单时根据机票由那个供应商提供去相应的供应商去下单。
简单工厂模式( Simple Factory Pattern ):又称为静态工厂方法( Static Factory Method )模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
结构
简单工厂包含了一下角色:
-
Factory: 工厂角色负责根据不同的参数创建不同的实例。
-
IProduct: 抽象产品角色所有产品实例的接口,负责描述所有产品实例的行为。
-
Product(A B ..): 具象产品角色所有产品的实例,实现了抽象产品定义的代码
场景示例:
简单工厂应用的场景比较对,那么就根据作者的理解,拿作者工作中遇到的场景需求举例: 平台做一个机票代购业务,对接了两个供应商A、B,用户选择完机票后,平台拿着机票去供应商下单。下单时根据机票由那个供应商提供去相应的供应商去下单。
第一步就是定义一个下单接口。
public interface IVender {
/**
* 供应商下单方法
*/
void order();
}
复制代码
然后分别实现A、B供应商的下单方法。
public class VendorA implements IVender {
@Override
public void order() {
// 业务逻辑处理
System.out.println("A供应商下单成功,下单时间" + new Date());
}
}
复制代码
public class VendorB implements IVender {
@Override
public void order() {
// 业务逻辑处理
System.out.println("B供应商下单成功,下单时间:" + new Date());
}
}
复制代码
接着定义一个工厂类,根据传入的不同参数请求,分别创建不同的供应商实例并返回,若碰到无效的参数,则抛出异常。
public class VendorFactory {
public static IVender createVendor(String type) {
switch (type) {
case "A":
return new VendorA();
case "B":
return new VendorB();
default:
throw new RuntimeException("供应商不存在");
}
}
}
复制代码
最后,由我们客户端进行调用:
public class Client {
public static void main(String[] args) {
String type = "A";
IVender iVender = VendorFactory.createVendor(type);
iVender.order();
}
}
复制代码
如果我们都写在一个类中:
public class Client2 {
private static final String TYPE_A = "A";
private static final String TYPE_B = "B";
public static void main(String[] args) {
String type = "A";
if (Objects.equals(TYPE_A, type)) {
// A 供应商下单逻辑处理
System.out.println("A供应商下单成功,下单时间" + new Date());
} else if (Objects.equals(TYPE_B, type)) {
// B 供应商下单逻辑处理
System.out.println("A供应商下单成功,下单时间" + new Date());
} else {
throw new RuntimeException("供应商不存在");
}
}
}
复制代码
第二种写法,供应商下单逻辑较多的话会使客户端变得十分复杂,后期维护起来也将是一个灾难。如果新增加一个供应商,将会对这个类有这较大的改动,很明显的违反了 开闭原则 与 迪米特法则 。
优点
- 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
- 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
- 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
缺点
- 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
- 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
- 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
使用场景
在以下情况下可以使用简单工厂模式:
- 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
- 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Learn Python the Hard Way
Zed A. Shaw / Addison-Wesley Professional / 2013-10-11 / USD 39.99
Master Python and become a programmer-even if you never thought you could! This breakthrough book and CD can help practically anyone get started in programming. It's called "The Hard Way," but it's re......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!