工厂模式简介
工厂模式是我们日常开发工作中经常使用的设计模式,它属于创建型设计模式,我们常用的工厂模式有:简单工厂模式
,工厂方法模式
,抽象工厂模式
三种类型;下面我们一起来领略一下它们各自的特点。
简单工厂模式
简单工厂模式,又称为静态工厂模式;其核心是工厂类,包含了必要的处理逻辑,可以根据外界跟定的信息,返回指定的结果。参考以下示例:
Car
//定义Car
public interface Car {
String getName();
}
//Jeep实现类
public class Jeep implements Car {
@Override
public String getName() {
return "Jeep";
}
}
//Truck实现类
public class Truck implements Car {
@Override
public String getName() {
return "Truck";
}
}
//Cooper实现类
public class Cooper implements Car {
@Override
public String getName() {
return "Cooper";
}
}
Factory
//Car 工厂类,根据传入的name,生产具体的Car
public class CarFactory {
public Car getCar(String name) {
switch (name) {
case "Jeep":
return new Jeep();
case "Truck":
return new Truck();
case "Cooper":
return new Cooper();
default:
throw new RuntimeException();
}
}
}
演示Demo
public class Demo {
public static void main(String[] args) {
CarFactory factory = new CarFactory();
Car jeep = factory.getCar("Jeep");
System.out.println(jeep.getName());
Car truck = factory.getCar("Truck");
System.out.println(truck.getName());
Car cooper = factory.getCar("Cooper");
System.out.println(cooper.getName());
}
}
当然,简单工厂的缺点也很明显:
- 增加新的产品,需要修改Factory的代码
- 不存在所有Object都可以生产的工厂
工厂方法模式的出现,对这些缺点有了一定的克服。
工厂方法模式
工厂方法模式的特点是在工厂类中定义了创建产品的接口,而具体的实现交由子类工厂去实现;通过此种方式将变化
封装了起来,遵守开闭原则
,实现了可扩展;参看以下示例。
public interface CarFactory {
// 定义了获取Car接口
Car getCar();
}
//Jeep工厂类
public class JeepFactory implements CarFactory {
@Override
public Car getCar() {
return new Jeep();
}
}
//Cooper工厂类
public class CooperFactory implements CarFactory {
@Override
public Car getCar() {
return new Cooper();
}
}
//Truck工厂类
public class TruckFactory implements CarFactory {
@Override
public Car getCar() {
return new Truck();
}
}
演示Demo
public class Demo {
public static void main(String[] args) {
CarFactory jeepFactory = new JeepFactory();
Car jeep = jeepFactory.getCar();
System.out.println(jeep.getName());
TruckFactory truckFactory = new TruckFactory();
Car truck = truckFactory.getCar();
System.out.println(truck.getName());
CooperFactory cooperFactory = new CooperFactory();
Car cooper = cooperFactory.getCar();
System.out.println(cooper.getName());
}
}
工厂方法模式是对简单工厂做了抽象,工厂方法模式是典型的模板模式的应用。通过代码,我们发现:工厂方法模式的较简单工厂而言实现比较复杂
,对于可以形成产品族的情况较难处理
。
其中针对对于可以形成产品族的情况较难处理
这里情况,在抽象工厂模式
中得到一定的处理。
抽象工厂模式
抽象工厂模式是为一系列相关的,或者有依赖关系的对象创建提供接口;我们可以参考一下代码:
我们在原有Car
的逻辑上扩展了Window
车窗
//定义Window
public interface Window {
String getModel();
}
//小型车窗
public class SmallWindow implements Window {
@Override
public String getModel() {
return "Small";
}
}
//中型车窗
public class MidWindow implements Window {
@Override
public String getModel() {
return "Mid";
}
}
//大型车窗
public class BigWindow implements Window {
@Override
public String getModel() {
return "Big";
}
}
CarFactory
升级
public interface CarFactory {
//创建车窗
Window createWindow();
//创建车
Car createCar();
}
//Jeep工厂
public class JeepFactory implements CarFactory {
@Override
public Window createWindow() {
return new MidWindow();
}
@Override
public Car createCar() {
return new Jeep();
}
}
//Truck工厂
public class TruckFactory implements CarFactory {
@Override
public Window createWindow() {
return new BigWindow();
}
@Override
public Car createCar() {
return new Truck();
}
}
//Cooper工厂
public class CooperFactory implements CarFactory {
@Override
public Window createWindow() {
return new SmallWindow();
}
@Override
public Car createCar() {
return new Cooper();
}
}
Demo实例
public class Demo {
public static void main(String[] args) {
CarFactory jeepFactory = new JeepFactory();
Window jeepWindow = jeepFactory.createWindow();
System.out.println(jeepWindow.getModel());
Car jeepCar = jeepFactory.createCar();
System.out.println(jeepCar.getName());
CarFactory truckFactory = new TruckFactory();
Window truckWindow = truckFactory.createWindow();
System.out.println(truckWindow.getModel());
Car truckCar = truckFactory.createCar();
System.out.println(truckCar.getName());
}
}
相较于工厂方法模式,抽象工厂模式对产品族(相关联的对象)支持的较好,但是还是没有解决实现复杂
的问题;而针对这一问题,我们可以通过与简单工厂的结合使用,或者与反射的结合使用来降低实现的复杂度。
- 本文链接: https://www.sunce.wang/archives/设计模式之构建万物的工厂模式
- 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!