@
一、概述
工厂方法模式同样属于类的创建型模式,工厂方法模式是定义一个工厂接口,将实际创建工作推迟到子类当中。核心工厂不在负责产品对象的创建,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是可以是系统在不修改工厂角色的情况下引进新的产品。
二、模式结构图
三、模式中包含的角色及职责
组成(角色) | 关系 | 作用 |
---|---|---|
抽象产品(Product) | 具体产品的父类 | 描述具体产品的公共接口 |
具体产品(Concrete Product) | 抽象产品的子类;工厂类的目标类 | 描述生产的具体产品 |
抽象工厂(Factory) | 具体工厂的父类 | 描述具体工厂的公共接口 |
具体工厂(Concrete Factory) | 抽象工厂的子类;被外界调用 | 描述具体工厂FactoryMethod工厂方法创建产品的实例。 |
四、具体代码实现
1、创建产品接口和工厂接口
还是用水果工厂举例,首先我们需要水果接口和水果工厂接口来约束具体的水果类和水果工厂类;
package 工厂方法模式;
public interface Fruit {
// 生产水果
public void get();
}
package 工厂方法模式;
public interface FruitFactory {
// 此接口只是作为一个约束的角色
public Fruit getFruit();
}
2、创建具体产品
创建具体的产品类来继承产品接口,实现为实现的方法,在这里创建了两个产品类Apple和Pear
package 工厂方法模式;
public class Apple implements Fruit {
@Override
public void get(){
// TODO Auto-generated method stub
System.out.println("生产苹果!");
}
}
package 工厂方法模式;
public class Pear implements Fruit{
public void get() {
// TODO Auto-generated method stub
System.out.println("生产苹果!");
}
}
3、创建具体的产品工厂类
具体的产品工厂类继承了产品工厂接口,它的功能是去产省对应的产品对象
package 工厂方法模式;
public class AppleFactory implements FruitFactory {
@Override
public Fruit getFruit() {
return new Apple();
}
}
package 工厂方法模式;
public class PearFactory implements FruitFactory{
@Override
public Fruit getFruit() {
// TODO Auto-generated method stub
return new Pear();
}
}
4、调用实现
package 工厂方法模式;
public class text {
public static void main(String[] args) {
FruitFactory factory1 = new AppleFactory();
Fruit fruit1 = factory1.getFruit();
FruitFactory factory2 = new PearFactory();
Fruit fruit2 = factory2.getFruit();
fruit1.get();
fruit2.get();
}
}
五、简单工厂模式和工厂方法模式的比较
工厂方法模式与简单工厂模式在结构上的类似。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及具体工厂对象,原工厂对象不需要进行修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好!