深入理解设计模式-工厂方法模式

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抽象工厂模式对比讲解

深入理解设计模式-简单工厂模式vs工厂方法模式vs抽象工厂模式对比讲解

深入理解设计模式-抽象工厂模式

深入理解设计模式-抽象工厂模式