深入理解设计模式-工厂方法模式
Posted 、Dong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解设计模式-工厂方法模式相关的知识,希望对你有一定的参考价值。
文章目录
前言
在现实生活中社会分工越来越细,越来越专业化。各种产品有专门的工厂生产,彻底告别了自给自足的小农经济时代,这大大缩短了产品的生产周期,提高了生产效率。同样,在软件开发中能否做到软件对象的生产和使用相分离呢?能否在满足“开闭原则”的前提下,客户随意增删或改变对软件相关对象的使用呢?这就是本节要讨论的问题。
在简单工厂模式中,我们提到了简单工厂模式违背了开闭原则,而“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
一、定义
工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。
它的核心结构有四个角色:
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
- 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
二、使用场景
工厂方法经常用在以下两种情况中:
第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
三、代码样例
1.需求
延续简单工厂模式的计算器控制台程序,要求输入两个数和运算符号,得到结果。
2.类图
3.工厂相关类
/**
* 工厂接口
*
*/
public interface IFactory
public Operation createOperation();
class AddFactory implements IFactory
@Override
public Operation createOperation()
return new OperationAdd();
class SubFactory implements IFactory
@Override
public Operation createOperation()
return new OperationSub();
class MulFactory implements IFactory
@Override
public Operation createOperation()
return new OperationMul();
class DivFactory implements IFactory
@Override
public Operation createOperation()
return new OperationDiv();
4.产品相关类
/**
* 操作类抽象类
*
*/
public abstract class Operation
public double numberA;
public double numberB;
public abstract double result();
/**
* 加法类
*
*/
public class OperationAdd extends Operation
@Override
public double result()
return numberA + numberB;
/**
* 除法类
*
*/
public class OperationDiv extends Operation
@Override
public double result()
if (numberB == 0)
throw new RuntimeException("divided by 0");
return numberA / numberB;
/**
* 乘法类
*
*/
public class OperationMul extends Operation
@Override
public double result()
return numberA * numberB;
/**
* 减法类
*
*/
public class OperationSub extends Operation
@Override
public double result()
return numberA - numberB;
5.客户端
/**
* 工厂方法客户端
*
*/
public class FactoryClient
public static void main(String[] args)
IFactory operFactory = new DivFactory();
Operation operation = operFactory.createOperation();
operation.numberA = 3.4;
operation.numberB = 4.5;
System.out.println(operation.result());
四、优缺点
优点:
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
缺点:
- 类的个数容易过多,增加复杂度
- 增加了系统的抽象性和理解难度
- 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。
结尾
- 感谢大家的耐心阅读,如有建议请私信或评论留言。
- 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步
以上是关于深入理解设计模式-工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章
深入理解设计模式-简单工厂模式vs工厂方法模式vs抽象工厂模式对比讲解