秒懂设计模式之工厂方法模式(Factory Method Pattern)

[版权申明] 非商业目的注明出处可自由转载
博文地址:https://blog.csdn.net/ShuSheng0007/article/details/86636494
出自:shusheng007

设计模式汇总篇,一定要收藏:

永不磨灭的设计模式(有这一篇真够了,拒绝标题党)

前言

人在IT江湖飘,不懂设计模式咋装X?

今天让我们一起来研究一下三种工厂模式,其均为创建型模式,即讨论的是如何创建一个类的对象的问题。就是以各种高逼格的方式最终将一个类的对象new出来,一点也不神秘。如果你发现需要一个类的对象而你又不会这些装X神器,那你就直接new好啦,爱谁谁。。。不过你也就逃脱不永远是个小白的命运啦,过几年混不下去了就只能去卖奶茶,什么?你不想那么快就去卖奶茶,那就好好学习这些装X神器!

定义

来小朋友们,让我们干了定义这杯苦酒吧:

Define an interface for creating an object, but let subclasses decide which class to instantiate. The Factory method lets a class defer instantiation it uses to subclasses.
定义一个用于创建对象的接口,让子类决定实例化哪个类

使用场景

最重要的知识点,这是最重要的知识点,这是最重要的知识点!

首先当然是在你需要new一个类的对象的时候,此时各种状况出现啦:

  1. 你不想直接new这个类的对象,怕以后这个类改变的时候你需要回来改代码,而此时依赖这个类的地方已经到处都是了。
  2. 这个类的对象构建过程非常复杂,你不愿意将这么复杂的构建过程一遍又一遍的写在需要用到此对象的地方。
  3. 这个类的对象在构建过程中依赖了很多其他的类,而你无法在调用的地方提供。

工厂方法模式是简单工厂方法模式的升级版本,为了克服简单工厂方法模式的缺点而生,作用和简单工厂方法完全一样。

如何实现

工厂方法模式为每一种产品生成一个对应的工厂,从而替换掉简单工厂方法模式中那个静态工厂方法。

业务场景

假设我们现在要生产多种牌子的笔记本电脑,例如要生产小米笔记本电脑和苹果笔记本电脑,那我们如何用代码实现这个业务呢?

使用工厂方法模式

工厂方法模式的核心思想:讨论的仍然是如何构建同一类型产品(都实现同一个接口)的问题,只不过是通过为每一种要生产的产品配备一个工厂,就是说每个工厂只生产一种特定的产品。这样做的好处就是当以后需要增加新的产品时,直接新增加一个对应的工厂就可以了,而不是去修改原有的工厂。下面我们看下具体代码:

第一步:定义一个电脑的抽象基类,里面有一个为电脑安装操作系统的抽象方法,这个就是产品要实现的共同接口。

public abstract class Computer {
    public abstract void setOperationSystem();
}

第二步:定义具体品牌的电脑类,苹果电脑和小米电脑。

public class MacComputer extends Computer {
    @Override
    public void setOperationSystem() {
        System.out.println("Mac笔记本安装Mac系统");
    }
}
public class MiComputer extends Computer {
    @Override
    public void setOperationSystem() {
        System.out.println("小米笔记本安装Win10系统");
    }
}

第三步:定义工厂,首先定义一个抽象工厂ComputerFactory接口,里面规定了生产方法,通过这个方法就可以生产出电脑,但是生产不同品牌的电脑的具体方式肯定是不同的,例如生产小米电脑的流水线和生产苹果电脑的流水线肯定是有区别的,所以这个接口方法有具体产品工厂去实现。例如这里的生产苹果电脑的MacComputerFactory工厂和生产小米电脑的MiComputerFactory工厂。

public interface ComputerFactory {
     Computer makeComputer();
}
public class MacComputerFactory implements ComputerFactory {
    @Override
    public Computer makeComputer() {
        return new MacComputer();
    }
}
public class MiComputerFactory implements ComputerFactory {
    @Override
    public Computer makeComputer() {
        return new MiComputer();
    }
}

简单工厂模式中那个静态工厂方法就被上面的那些工厂类代替了。

第四步:使用具体的工厂来生产相应品牌的电脑,例如要生产Mac电脑,就构建Mac的生产工厂,然后去生产产品。

    public static void main(String[] args) {
        //生产Mac电脑
        ComputerFactory macFactory=new MacComputerFactory();
        macFactory.makeComputer().setOperationSystem();

        //生产小米电脑
        ComputerFactory miFactory=new MiComputerFactory();
        miFactory.makeComputer().setOperationSystem();
    }

输出:

Mac笔记本安装Mac系统
小米笔记本安装Win10系统

优缺点

优点:不直接在客户端创建具体产品的实例,降低了耦合性。
缺点:每增加一种产品就要相应的增加一个工厂类,比较繁琐。

总结

设计模式值得你可以练习!

最后,如果你从本文中有所收获,可否点赞转发支持一下博主,你小小的鼓励,是激发博主持续写作的动力…

GitHub源码地址design-patterns

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShuSheng007

亲爱的猿猿,难道你又要白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值