继上一篇文章笔者介绍了工厂模式中的简单工厂模式,这次笔者将介绍工厂模式中的另外一个类别:工厂方法模式
不过我们首先将工厂模式中的三个分类再次简单浏览下:
工厂模式的分类:
1.简单工厂模式
2.工厂方法模式
3.抽象工厂模式
那么,什么是工厂方法模式?
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。其又称为:“多边形工厂”。
再来看一下他的组成:
1.抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2.具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
3.抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4.具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
在这里我们举另外一个例子,我们以买车为例,我们有两款车:
1.Bmw(宝马)
2.Benz(奔驰)
那么首先看一下我们的抽象产品角色Car:
package com.kameleon.factoryMethod;
public interface Car{
public void drive();
}
接下来是我们的具体产品角色,这里我只以Bmw为例,其他具体产品角色同理可得:
package com.kameleon.factoryMethod;
public class Bmw implements Car{
public void drive() {
System.out.println("Driving Bmw ");
}
}
之后是我们的抽象工厂角色Driver:
package com.kameleon.factoryMethod;
public interface Driver{
public Car driverCar();
}
在接下来是我们的具体工厂角色,在这里我仍以BmwDriver为例,这个类是指专门驾驶Bmw的驾驶者类,其他具体工厂角色同理可得:
package com.kameleon.factoryMethod;
public class BmwDriver implements Driver{
public Car driverCar() {
return new Bmw();
}
}
最后我们写一个测试类:
package com.kameleon.factoryMethod;
public class Kameleon
{
public static void main(String[] args)
{
try{
Driver driver = new BenzDriver();
Car car = driver.driverCar();
car.drive();
}catch(Exception e){ }
}
}
那么输出自然不用我多说。
最后我们来简单的分析下工厂方法模式:
首先看一下工厂方法模式的结构图(以这个例子为主):
我们发现在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。相对于简单工厂模式,工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”,另外对于增加新的产品类而言,这个系统完全支持“开-闭”原则。
最后笔者将在下一篇文章中为大家简单的说一下工厂模式的最后一个类别:抽象工厂模式
如果有问题,也欢迎大家指出!