简介:
工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
工厂方法模式(Factory Method pattern)是最典型的模板方法模式(Template Method pattern)应用。
1. 定义
工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品.
2. 解决的问题
工厂方法经常用在以下两种情况中:
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
3. 例子
抽象工厂:定义一个轮滑工厂接口,有一个创建轮滑鞋的抽象方法.
实现接口类:圣巴轮滑厂商,木瓜轮滑厂商分别实现接口
抽象产品:根据参数返回具体的厂商
实现产品:各种轮滑产品
类图
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/6 21:34
* @Desc: as follows.
* 轮滑工厂接口
*/
public interface ISkateFactory {
ISkateProduct produceSkate();
}
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/6 21:20
* @Desc: as follows.
* 抽象轮滑产品
*/
public interface ISkateProduct {
/**
* 抽象滑行方法
*/
void skate();
}
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/6 21:34
* @Desc: as follows.
* 木瓜轮滑工厂
*/
public class PapayaSkateFactory implements ISkateFactory {
@Override
public ISkateProduct produceSkate() {
System.out.println("生产【PAPAYA】轮滑鞋......");
return new PapayaSkate();
}
}
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/6 21:35
* @Desc: as follows.
* 圣巴轮滑工厂
*/
public class SebaSkateFactory implements ISkateFactory {
@Override
public ISkateProduct produceSkate() {
System.out.println("生产【SEBA】轮滑鞋");
return new SebaSkate();
}
}
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/6 21:34
* @Desc: as follows.
* 木瓜轮滑鞋
*/
public class PapayaSkate implements ISkateProduct {
@Override
public void skate() {
System.out.println("PAPAYA轮滑鞋滑行");
}
}
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/6 21:35
* @Desc: as follows.
* 圣巴轮滑鞋
*/
public class SebaSkate implements ISkateProduct {
@Override
public void skate() {
System.out.println("SEBA轮滑鞋滑行");
}
}
/**
* @Author: bufoon
* @Email: 285395841@qq.com
* @Datetime: Created In 2018/4/6 21:35
* @Desc: as follows.
* 测试
*/
public class Test {
public static void main(String[] args) {
// 圣巴
ISkateFactory skateFactory = new SebaSkateFactory();
skateFactory.produceSkate().skate();
// papaya
skateFactory = new PapayaSkateFactory();
skateFactory.produceSkate().skate();
}
}
输出:
生产【SEBA】轮滑鞋
SEBA轮滑鞋滑行
生产【PAPAYA】轮滑鞋......
PAPAYA轮滑鞋滑行
4. 思考
工厂方法模式的应用很普遍,因为他遵循了单一职责,和面向接口编程原则,但是如果产品改变了,则需要修改工厂,这就需要程序设计者自己的经验考虑
工厂方法模式跟抽象工厂模式的区别就是,工厂方法是单个产品对应单个工厂,抽象工厂是一个产品组的概念,定义一个抽象工厂和各种产品组的定义