工厂模式
Posted chainsmokers
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式相关的知识,希望对你有一定的参考价值。
??工厂模式主要分为简单工厂模式、工厂方法模式和抽象工厂模式,它主要作用是将对象实例化的部分抽取出来,降低代码的耦合度,其中简单工厂模式不属于23种设计模式。下面将对这三种模式进行介绍。
一、简单工厂模式
1.静态工厂模式
??创建静态工厂方法,传入类型来返回相应实例。下面我们写一个简单工厂类来创建Vehicle实例。创建一个Vechile接口和实现它的三个具体类:Bike、Car、Trunk。静态工厂类代码如下所示:
/**
* 静态工厂类
*/
public class VehicleFactory {
public enum VehicleType{
Bike,
Car,
Truck;
}
public static Vehicle createVehicle(VehicleType type){
if(type.equals(VehicleType.Bike)){
return new Bike();
}
if(type.equals(VehicleType.Car)){
return new Car();
}
if(type.equals(VehicleType.Truck)){
return new Truck();
}
return null;
}
}
??工厂类逻辑很简单,只负责创建Vehicle类的实例,符合单一职责原则;用户只调用Vehicle接口,这样可以减少耦合,符合依赖倒置原则;但增加一个新的Vehicle实现类则需要对VehicleFactory进行修改,这样就打破了开闭原则。
??我们可以改进这种模式,使得在注册新的类可以被实例化,从而保证对其扩展开放同时修改闭合。实现的具体方式可以使用反射机制注册产品类对象和实例化。
2.使用反射机制的简单工厂模式
/**
* 反射机制的简单工厂类
*/
public class VehicleFactory {
private Map<String, Class> registerProducts = new HashMap<String, Class>();
public void registerVehicle(String vehicleId, Class vehicleClass){
registerProducts.put(vehicleId, vehicleClass);
}
public Vehicle createVehicle(String vehicleType) throws Exception{
Class productClass = registerProducts.get(vehicleType);
return (Vehicle) productClass.newInstance();
}
}
??但在默写情况下,反射机制并不适用,比如在特定环境中无法实现。反射机制也会降低程序的运行效率,对性能要求很高的情况下应该避免使用这种机制。
二、工厂方法模式
??工厂方法模式是在静态工厂模式上的改进。工厂类需要被抽象化,用于实例化特定产品类的代码被转移到实现抽象方法的子类中。这样无需修改就可以扩展工具类。
工厂方法有4个对象:
- 抽象工厂类(Factory):提供抽象方法供具体工厂实现
- 具体工厂类(ConcreteFactory):提供具体的工厂
- 抽象产品类(Product):提供抽象方法供具体产品类实现
- 具体产品类(ConcreteProduct):提供具体的产品
抽象工厂类:
/**
* 汽车工厂
*/
public abstract class VehicleFactory {
public abstract Vehicle createVehicle();
}
具体工厂类:
public abstract class Vehicle {
public abstract void product();
}
抽象产品类
/**
* 自行车工厂
*/
public class BikeFactory extends VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Bike();
}
}
具体产品类
public class Bike extends Vehicle {
@Override
public void product() {
System.out.println("生产自行车");
}
}
三、抽象工厂模式
??抽象工厂模式是工厂方法模式的扩展版本。他不再是需要单一类型的对象,而是创建一系列相关联的对象。如果说工厂方法模式只包含一个抽象产品类,那么抽象工厂模式则包含多个抽象产品类。
??工厂方法类只有一个抽象方法,在不同的具体工厂类中分别实现抽象产品的实例化,而在抽象工厂类中,每个抽象产品都有一个实例化方法。
汽车类:
public abstract class Car {
abstract void drive();
}
宝马产品类:
public abstract class BMWCar extends Car {
}
具体产品BMW320类:
public class BMW320 extends BMWCar {
public void drive()
{
System.out.println("BMW320,运动酷炫。");
}
}
工厂类:
public class BMWFactory extends AbstractFactory {
public Car getCar(String type) throws ClassNotFoundException,
IllegalAccessException, InstantiationException
{
Class cl = Class.forName(type);
return (BMWCar)cl.newInstance();
}
}
抽象工厂类:
public abstract class AbstractFactory {
public abstract Car getCar(String type) throws ClassNotFoundException,
IllegalAccessException, InstantiationException;
}
以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )