设计模式(Java语言)- 工厂方法模式

  前言  

  在介绍工厂方法模式之前,我们需要知道这个设计模式是什么,解决了什么样的问题?在上一篇博客 设计模式(Java语言)- 简单工厂模式 介绍了简单工厂模式,然后总结了简单工厂模式的缺点:

    1、当新增类型时,我们不得不修改原来的工厂,这样就违背了设计模式6大原则中的 开闭原则。

    2、简单工厂模式使用了静态方法来创建对象,因此无法被实现或继承,从而导致改工厂类缺少灵活性,不易拓展。

    3、所有的类的创建都需要这个工厂类,因此系统已工厂类是强依赖的关系,一旦工厂类出现错误,将对整个系统产生比较大的影响。

  工厂方法模式就是解决上简单工厂模式的缺点。工厂方法模式UML类图:设计模式(Java语言)- 工厂方法模式_第1张图片

 

   创建工厂方法模式步骤

  1、创建抽象产品类,定义接口。

  2、创建抽象工厂,定义具体工厂的接口。

  3、创建具体的产品类

  4、创建具体的工厂类

  5、客户端调用工厂类创建对象

  

  应用案例

  本模式我们加ing继续使用创建手机作为例子来讲解。我们根据上面的步骤来完成创建手机的流程:

  第一步定义抽象工厂方法:
/**
 * @className: IphoneFactory
 * @description: iphone手机工厂类
 * @author: rainple
 * @create: 2020-01-21 20:52
 **/
public class IphoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        Iphone iphone = new Iphone();
        iphone.setName("iphone手机");
        return iphone;
    }
}
  第二步创建抽奖产品类
/**
 * @InterfaceName: Phone
 * @description: 抽象手机
 * @author: rainple
 * @create: 2020-01-21 20:48
 **/
public abstract class Phone {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  第三步创建具体产品类
/**
 * @className: Iphone
 * @description:
 * @author: rainple
 * @create: 2020-01-21 20:51
 **/
public class Iphone extends Phone {

}


/**
 * @className: HuaWeiPhone
 * @description: 华为手机
 * @author: rainple
 * @create: 2020-01-21 20:52
 **/
public class HuaWeiPhone extends Phone {

}

 

  第四步创建具体的工厂方法
/**
 * @className: HuaWeiFactory
 * @description: 华为手机工厂
 * @author: rainple
 * @create: 2020-01-21 21:04
 **/
public class HuaWeiFactory implements PhoneFactory {
    @Override
    public Phone createPhone() {
        HuaWeiPhone huaWeiPhone = new HuaWeiPhone();
        huaWeiPhone.setName("华为手机");
        return huaWeiPhone;
    }
}

/**
 * @className: IphoneFactory
 * @description: iphone手机工厂类
 * @author: rainple
 * @create: 2020-01-21 20:52
 **/
public class IphoneFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        Iphone iphone = new Iphone();
        iphone.setName("iphone手机");
        return iphone;
    }
}
  第五步客户端调用
/**
 * @className: Client
 * @description: 客户端
 * @author: rainple
 * @create: 2020-01-21 21:06
 **/
public class Client {

    public static void main(String[] args) {
        //iphone工厂
        PhoneFactory phoneFactory = new IphoneFactory();
        //创建iPhone手机
        Phone phone = phoneFactory.createPhone();
        System.out.println(phone.getName());
        //华为工厂
        phoneFactory = new HuaWeiFactory();
        //创建华为手机
        System.out.println(phoneFactory.createPhone().getName());
    }

}

  

  总结

  一、优点

    1、遵循开闭原则,新增产品类时只需要增加相应的工厂以及产品即可,不需要修改原有的代码。

    2、符合单一职责原则,每个工厂类只负责一种产品的创建

    3、使用非静态方法来创建产品,利于后续对产品的拓展,可拓展性增加

  二、缺点

  • 每次增加新的产品时都需要对应的添加工厂类,当产品越来越多时系统创建类就越多,越来越复杂,不利于后期的维护。同时,类的创建和销毁可能会对系统造成一定的开销。
  • 一个工厂只能创建一种产品

  

你可能感兴趣的:(设计模式(Java语言)- 工厂方法模式)