尺有所短,寸有所长;不忘初心,方得始终。
一、什么是工厂方法模式
-
工厂方法模式(Factory Method Pattern),也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。
-
在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
-
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
二、工厂方法模式的适用场景
-
客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。 -
创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。 -
客户不关心创建产品的细节,只关心产品的品牌。
三、工厂方法模式结构
-
抽象产品角色(Product):定义产品的接口
-
具体产品角色(ConcreteProduct) :实现接口产品的具体产品类
-
抽象工厂角色(Creator) :声明工厂方法(FactoryMethod),返回一个产品
-
真实的工厂(ConcreteCreator):实现FactoryMethod工厂方法,由客户调用,返回一个产品的实例
四、工厂方法模式实现方式
-
创建同一接口,抽象产品角色。声明对所有产品都有意义的行为方法。
-
为每种产品创建产品的具体产品角色,实现抽象产品角色接口。
-
定义抽象工厂角色,接口中定义一个工厂方法。该方法的返回类型必须遵循通用的产品接口。
-
为每种产品定义一个真实的工厂, 并实现抽象工厂角色中的工厂方法, 将具体产品角色中的相关对象的创建移动到工厂方法中。
如果应用中的产品类型太多, 那么为每个产品创建子类并无太大必要, 这时也可以在子类中复用基类中的控制参数。
五、工厂方法模式的实现
工厂方法模式的实现其实是在简单工厂代码的基础上加以改造
-
抽象工厂角色实现
/**
* 抽象工厂
*/
public interface IFactory {
//定义一个方法用于创建汽车工厂
ICar CreateCar();
} -
抽象产品角色实现
/**
* 抽象产品类代码
*/
public interface ICar {
void GetCar();
} -
具体工厂角色实现
/**
* 具体工厂类:用于创建两厢车类
*/
public class HatchbackFactory implements IFactory{
@Override
public ICar CreateCar() {
return new HatchbackCar();
}
}
/**
* 具体工厂类:用于创建越野车类
*/
public class JeepFactory implements IFactory{
@Override
public ICar CreateCar() {
return new JeepCar();
}
}
/**
* 具体工厂类:用于创建跑车类
*/
public class SportFactory implements IFactory{
@Override
public ICar CreateCar() {
return new SportCar();
}
} -
具体产品角色实现 与简单工厂代码一致
/**
* 具体汽车 : 越野车
*/
public class JeepCar implements ICar {
@Override
public void GetCar() {
System.out.println("这是越野车");
}
}
/**
* 具体汽车 : 跑车
*/
public class SportCar implements ICar {
@Override
public void GetCar() {
System.out.println("这是跑车");
}
}
/**
* 具体汽车 : 两箱车
*/
public class HatchbackCar implements ICar {
@Override
public void GetCar() {
System.out.println("这是两箱车");
}
} -
客户端代码实现
public static void main(String[] args) {
IFactory factory = new JeepFactory();
ICar car = factory.CreateCar();
car.GetCar();
}
六、工厂方法模式的优缺点
-
优点
-
工厂和具体产品之间的解耦 -
遵循单一职责原则,将产品创建代码放在程序的单一位置, 易维护。 -
遵循开闭原则,无需更改现有客户端代码, 就可以在程序中引入新的产品类型。 -
缺点
在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度。
七、工厂方法模式和简单工厂模式的区别
-
简单工厂模式
-
工厂类负责创建的对象比较少,不会造成工厂方法中的业务逻辑太过复杂。
-
客户端只知道传入工厂类的参数,对于如何创建对象并不关心。
-
工厂方法模式
-
客户端不知道它所需要的对象的类。
-
抽象工厂类通过其子类来指定创建哪个对象。
八、总结
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
– END –
原文始发于微信公众号(星河之码):设计模式(3):工厂方法模式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/27207.html