简单工厂模式严格来讲并非一个设计模式,反而较像是一种编程习惯。编程
简单工厂模式(Simple Factory Pattern
):又称为静态工厂方法(Static Factory Method
)模式,它属于类建立型模式。在简单工厂模式中,能够根据参数的不一样返回不一样类的实例。简单工厂模式专门定义一个类来负责建立其余类的实例,被建立的实例一般都具备共同的父类。设计模式
简单工厂包含了一下角色:bash
Factory: 工厂角色 负责根据不一样的参数建立不一样的实例。ide
IProduct: 抽象产品角色 全部产品实例的接口,负责描述全部产品实例的行为。ui
Product(A B ..): 具象产品角色 全部产品的实例,实现了抽象产品定义的代码spa
简单工厂应用的场景比较对,那么就根据做者的理解,拿做者工做中遇到的场景需求举例: 平台作一个机票代购业务,对接了两个供应商A、B,用户选择完机票后,平台拿着机票去供应商下单。下单时根据机票由那个供应商提供去相应的供应商去下单。设计
第一步就是定义一个下单接口。3d
public interface IVender {
/**
* 供应商下单方法
*/
void order();
}
复制代码
而后分别实现A、B供应商的下单方法。code
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());
}
}
复制代码
接着定义一个工厂类,根据传入的不一样参数请求,分别建立不一样的供应商实例并返回,若碰到无效的参数,则抛出异常。cdn
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("供应商不存在");
}
}
}
复制代码
第二种写法,供应商下单逻辑较多的话会使客户端变得十分复杂,后期维护起来也将是一个灾难。若是新增长一个供应商,将会对这个类有这较大的改动,很明显的违反了开闭原则
与迪米特法则
。
在如下状况下可使用简单工厂模式: