为什么要使用工厂设计模式?
使用 Java 面向对象编程语言的开发小伙伴们,应该十分熟悉针对现实世界进行建模这个环节,将常见属性和行为封装成类,而要使用这些类就需要通过创建对象的形式来使用对应属性和触发对应的行为,在面向对象编程中创建与使用对象是最基础的操作了。
常见的创建型设计模式有:工厂模式、抽象工厂模式、单例模式,建造者模式、原型模式。
这些创建型设计模式都可以帮我们简化创建对象的逻辑,不过使用场景和解决的问题略有不同。接下来我们就先来看一看创建型设计模式中的工厂模式吧。
简单工厂 Simple Factory
/**
* 具体的火车类
*/
public class Train extends Car{
/**
* 驾驶火车
*/
@Override
void drive()
{
System.out.println("Train drive");
}
}
/**
* 具体的卡车类
*/
public class Truck extends Car{
/**
* 驾驶卡车
*/
@Override
void drive()
{
System.out.println("Truck drive");
}
}
/**
* 抽象的汽车类
*/
public abstract class Car {
/**
* 驾驶汽车
*/
abstract void drive();
}
/**
* 汽车工厂类
*/
public class CarFactory {
/**
* 根据汽车类型创建汽车
* @param type
* @return
*/
public static Car createCar(String type) {
if (type.equals("train")) {
return new Train();
} else if (type.equals("truck")) {
return new Truck();
} else {
throw new IllegalArgumentException("Unknown car type: " + type);
}
}
}
/**
* 这是一个Demo类,用于测试工厂类
*/
public class CarFactoryDemo {
public static void main(String[] args) {
//创建汽车工厂类
CarFactory carFactory = new CarFactory();
//通过工厂类获取火车对象
Car train = carFactory.createCar("train");
//驾驶火车
train.drive();
//通过工厂类获取卡车对象
Car truck = carFactory.createCar("truck");
//驾驶卡车
truck.drive();
}
}
可以看到前面的简单工厂有效的解决了创建汽车对象的封装与统一,但是引入了一堆的 if-else 判断,面向对象的程序不同于面向过程的程序这种复杂的 if-else 判断我们可以通过创建更多的工厂来解决。
接下来可以看下普通工厂设计模式的逻辑,普通工厂中不仅仅这些产品是抽象的,工厂也可以是抽象的。面对不同种的产品实现,就可以对应不同种的工厂实现。接下来可以通过图来看下:
/**
* 抽象的汽车类
*/
public abstract class Car {
/**
* 驾驶汽车
*/
abstract void drive();
}
/**
* 具体的火车类
*/
public class Train extends Car {
/**
* 驾驶火车
*/
void drive() {
System.out.println("Train drive");
}
}
/**
* 具体的卡车类
*/
public class Truck extends Car {
/**
* 驾驶卡车
*/
void drive() {
System.out.println("Truck drive");
}
}
/**
* 汽车工厂类
*/
public abstract class CarFactory {
/**
* 根据汽车类型创建汽车
* @param type
* @return
*/
public abstract Car createCar();
}
public class TrainFactory extends CarFactory {
public Car createCar() {
return new Train();
}
}
public class TruckFactory extends CarFactory{
public Car createCar() {
return new Truck();
}
}
/**
* 这是一个Demo类,用于测试工厂类
*/
public class CarFactoryDemo {
public static void main(String[] args) {
//通过工厂类获取火车对象
CarFactory trainFactory = new TrainFactory();
Car train = trainFactory.createCar();
//驾驶火车
train.drive();
CarFactory truckFactory = new TruckFactory();
//通过工厂类获取卡车对象
Car truck = truckFactory.createCar();
//驾驶卡车
truck.drive();
}
}
普通工厂有效的通过具体工厂实现来解决了简单工厂大量的 if-else 判断,但是也引来新的问题,如果产品类型比较多,大量的工厂实现会导致工厂类增多,抽象工厂将普通工厂再做一层抽象,同时进行折中处理,通过抽象工厂获取到大的工厂实现,工厂实现再根据逻辑来创建同一种类型的产品的不同实现。
点个在看,少个 bug
微信扫码关注该文公众号作者
戳这里提交新闻线索和高质量文章给我们。
来源: qq
点击查看作者最近其他文章