java设计模式之工厂方法模式

Posted J_Newbie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java设计模式之工厂方法模式相关的知识,希望对你有一定的参考价值。

定义:

工厂方法模式又叫做多态性工厂模式,指定义一个创建对象的接口,但又实现这个接口的类来决定实例化那个类,工厂化方法把类的实例化推迟到子类中进行。

在工厂化方法模式中,不再由单一的工厂类生产产品,而是由工厂类的子类实现具体产品的创建,因此,当增加一个产品时,只需要增加一个相应的工厂类的子类,实现生产这种产品,便可以解决简单工厂生产太多产品导致其内部代码臃肿的问题,也符合开闭原则。

应用场景:

  1. 创建对象需要大量的重复代码

  2. 客户端(应用层)不依赖产品类实例如何被创建,实现等细节

  3. 一个类通过其子类来指定创建哪个对象

UML类图:

由上图可以看见,抽象工厂模式主要包含4个角色:

  1. 抽象工厂:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口

  2. 具体工厂:是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且被应用程序调用以创建产品对象

  3. 抽象产品:是工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口

  4. 具体产品:这个角色实现了抽象产品角色所定义的接口,某具体产品由专门的具体工厂创建,它们之间往往一一对应

通用写法:

public class Client
  public static void main(String[] args)
    IFactory factory = new FactoryA();
    factory.makeProduct().doSomething();
    
    factory = new FactoryB();
    factory.makeProduct().doSomething();
    
    factory = new FactoryC();
    factory.makeProduct().doSomething();
  

//抽象工厂
public interface IFactory
  IProduct makeProduct();

//生产ProductA的具体工厂类
public class FactoryA implements IFactory
  public IProduct makeProduct()
    return new ProductA();
  

//生产ProductB的具体工厂类
public class FactoryB implements IFactory
  public IProduct makeProduct()
    return new ProductB();
  

//生产ProductC的具体工厂类
public class FactoryC implements IFactory
  public IProduct makeProduct()
    return new ProductC();
  

//抽象产品
public interface IProduct
  void doSomething();

//具体产品:ProductA
public static ProductA implements IProduct
  public void doSomething()
    System.out.println("I am Product A");
  


//具体产品:ProductB
public static ProductB extends FactoryB implements IProduct
  public void doSomething()
    System.out.println("I am Product B");
  


//具体产品:ProductC
public static ProductC implements IProduct
  public void doSomething()
    System.out.println("I am Product C");
  

案例:

工厂方法模式主要解决产品扩展问题,再简单工厂中,随着产品链的丰富,如果每个课程的创建逻辑都有区别,则工厂的职责会变的越来越多,有点像万能工厂,不利于维护,根据单一职能原则,我们将继续拆分,专人干专事。拿课程为例:

public interface ICourseFactory
  ICourse create();

 然后创建子工厂:

public class JavaCourseFactory implements ICourseFactory
  public ICourse create()
    return new JavaCourse();
  

PythonCourseFactory类的代码如下:

public class PythonCourseFactory implements ICourseFactory
  public ICourse create()
    return new PythonCourse();
  

客户端测试代码如下:

public static void main(String[] args)
  ICourseFactory factory = new PythonCourseFactory();
  factory.create().doSomething();
  

工厂方法模式的优点:

  1. 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类

  2. 典型的解耦框架。高层模块只需要知道产品的抽象类,无需关心其他的实现类,满足迪米特法则,依赖倒置原则和里氏替换原则

工厂方法的缺点:

  1. 类的个数容易过多,增加复杂度

  2. 增加了系统的抽象性和理解的难度

  3. 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决

以上是关于java设计模式之工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章

Java设计模式-工厂方法模式和抽象工厂模式

JAVA设计模式之---工厂模式

Java设计模式之二 ----- 工厂模式

Java设计模式之二工厂模式

Java进阶篇设计模式之二 ----- 工厂模式

抽象工厂和工厂方法