工厂模式是在简单工厂模式基础之上建立的,是对他进一步抽象和推广。他继承了 简单工厂 模式 的 客户端和业务层有效的被隔离开,增加了 客户端和业务层 的耦合行 的有点,同时也弥补了 简单工厂 对 不支持'“开闭原则”的缺点。工厂方法模式是类的创建模式,其用意是定义一个创建对象的工厂接口,将实际创建工作推迟到子类中去。工厂模式采用了 接口,多态技术。
我们还以农场的需求开始新的设计。
首先我们在前期的设计使用简单工厂模式把园丁(FruitGardener)设计成了一个全知全能的角色所有的水果都由他来控制,而现在这个农场的规模变大了,而同时发生的是管理更加的专业化,过去的全能者没有了,每一种植物都会由一个专门的园丁来管理,形成了规模化和专业化的生产。
那么好我们了解到了新的需求,知道了园丁管理方式的变化,既然有了很多的专业水果种植园丁加入进来,那么我们就需要对这些园丁进行分析,看看他们的共通的行为是什么。
public interface FruitGardener{
public Fruit factory();
所有园丁的共通行为就是生成水果所以把FruitGardener 类修改成为一个接口而具体园丁需要实现的是共通的行为factory()
设计UML图
按照刚才的设计对于Apple的园丁的实现如下:
public class AppleGardener implements FruitGardener {
public Fruit factory(){
return new Apple();
}
}
Grape的园丁的实现如下:
public class GrapeGardener implements FruitGardener {
public Fruit factory(){
return new Apple();
}
}
Strawberry的园丁的实现如下:
public class StrawberryGardener implements FruitGardener {
public Fruit factory(){
return new Apple();
}
}
回顾:我们的设计完成了,我们回头看看我们的代码,在想想关于工厂方法模式的定义
我们会发现我们刚刚设计的结构就是一个工厂方法模式的应用。
开闭原则和其优缺点
通过工厂方法模式能够很好的解决简单工厂关于开闭原则的缺点,例如:如果系统需要加入一个新的产品,那么所需要的就是向系统加入一个这个产品类以及它所对应的工厂类。而没有必要修改抽象工厂角色或者其他已有的具体工厂角色。也没有必要去修改客户端已经存在的程序。而这个系统完全支持开闭原则。但是由于当需要使用一个工厂时需要以抽象工厂对应一个具体工厂的方式来使用如下:
FruitGardener appleGardener = new AppleGardener();
Fruit fruitApple = appleGardener.factory();
这时也就表示在工厂创建部分需要时抽象工厂依赖具体工厂的实现,而我们往往希望的是根据当前的上下文状态来动态的决定需要那一种工厂具体实现。以便于我们的系统更具有良好的扩展性。
#注意:虽然,工厂模式 在 简单工厂模式 之上,扬长避短,但是 工厂模式 增加了类的层次,在一定程度上会增添羡慕的 代码量 ,因此,对于小的项目 简单工厂 足以