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

前言

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

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

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

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

工厂方法模式就是解决上简单工厂模式的缺点。工厂方法模式UML类图:
  在这里插入图片描述

创建工厂方法模式步骤

	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解忧杂货铺】,里面不定期发布一些技术干活,也可以免费获取大量最新最流行的技术教学视频

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值