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

定义:

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

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

应用场景:

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

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

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

UML类图:

java设计模式之工厂方法模式_第1张图片

由上图可以看见,抽象工厂模式主要包含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,设计模式,工厂方法模式)