首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >创建型模式:工厂方法

创建型模式:工厂方法

作者头像
LieBrother
发布于 2019-04-02 08:17:06
发布于 2019-04-02 08:17:06
40900
代码可运行
举报
文章被收录于专栏:LieBrotherLieBrother
运行总次数:0
代码可运行

五大创建型模式之二:工厂方法

简介

姓名:工厂方法

英文名:Factory method Pattern

价值观:扩展是我的专属

个人介绍

Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses. (定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)

(来自《设计模式之禅》)

你要的故事

还记得上一篇 单例模式 中的故事么?小明开着汽车去旅游、去学校、去聚会。这一次还是延续小明的故事,一个故事能讲 2 个设计模式,不容易呀。。。(每次想故事都想破脑袋,每一篇文章至少有 3 个故事从脑子里闪过,但最终留下的只有一个适合,为了就是能比较清晰简单的说明设计模式中的关键要点。)

简单工厂

小明家里以前不算很富裕,但是还是有一个不错的车库,什么汽车、摩托车、自行车啥的都放在这个车库里。小明每次要出去,都会到车库里面挑合适的车出发。比如,小明最近期末考试了,骑摩托车去学校考试,考完试之后,小明就准备去旅游,这次决定自驾游,开着自己家的小汽车去。这个场景我们用代码描述下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SimpleFactoryTest {

    public static void main(String[] args) {
        XiaoMing xiaoMing = new XiaoMing();
        // 小明骑摩托车去学校
        IVehicle motorcycle = GarageFactory.getVehicle("motorcycle");
        xiaoMing.goToSchool(motorcycle);
        // 小明开汽车去旅游
        IVehicle car = GarageFactory.getVehicle("car");
        xiaoMing.travel(car);
    }

}

/**
 * 车库
 */
class GarageFactory {

    public static IVehicle getVehicle(String type) {
        if ("car".equals(type)) {
            return new Car();
        } else if ("motorcycle".equals(type)) {
            return new Motorcycle();
        }
        throw new IllegalArgumentException("请输入车类型");
    }

}

/**
 * 交通工具
 */
interface IVehicle {
    void run();
}

/**
 * 汽车
 */
class Car implements IVehicle {

    @Override
    public void run() {
        System.out.println("开汽车去。。。。");
    }
}

/**
 * 摩托车
 */
class Motorcycle implements IVehicle {

    @Override
    public void run() {
        System.out.println("骑摩托车去。。。。");
    }
}


class XiaoMing {

    public void goToSchool(IVehicle vehicle) {
        System.out.println("小明去学校");
        vehicle.run();
    }

    public void travel(IVehicle vehicle) {
        System.out.println("小明去旅游");
        vehicle.run();
    }

}

上面代码看懂了么? 小明家里有一个车库 GarageFactory,里面放着汽车 Car 和摩托车 Motorcycle,小明要出去的时候,就到车库选择车,通过传递参数给 GarageFactory.getVehicle(),指明要什么车,然后小明就骑着车出发了。

这个代码真正的术语叫:简单工厂模式(Simple Factory Pattern),也叫做静态工厂模式。它是工厂方法中的一个实现方式,从字面理解就可以知道,它是最简单的工厂方法实现方式。它有一点点小缺陷,就是扩展性不够好,在上面代码中,小明只能骑摩托车或者开汽车,如果小明要骑单车出去呢?势必得在 GarageFactory 中添加 if 是自行车的逻辑。这违反了哪条规则了?是不是那个允许扩展,拒绝修改的开闭原则

不是说简单工厂这种实现方式不好,而是扩展性不够,在平时的开发中,简单工厂模式也用得不少。在这个小明家里车不多的情况下,用一个车库也是合适的。

工厂方法

小明老爸近几年赚了不少,车迷的两父子一直买车,家里的车越来越多,这时候,他们决定多建几个车库,按车类型放置。比如,有一个汽车库,一个摩托车库。这时候小明要开汽车就去汽车库,要骑摩托车就去摩托车库。代码实现如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class FactoryMethodTest {

    public static void main(String[] args) {
        XiaoMing xiaoMing = new XiaoMing();
        // 小明骑摩托车去学校
        VehicleGarage motorcycleGarage = new MotorcycleGarage();
        IVehicle motorcycle = motorcycleGarage.getVehicle();
        xiaoMing.goToSchool(motorcycle);
        // 小明开汽车去旅游
        VehicleGarage carGarage = new CarGarage();
        IVehicle car = carGarage.getVehicle();
        xiaoMing.travel(car);
    }

}

interface VehicleGarage {
    IVehicle getVehicle();
}

/**
 * 汽车车库
 */
class CarGarage implements VehicleGarage {

    @Override
    public IVehicle getVehicle() {
        return new Car();
    }
}

/**
 * 摩托车车库
 */
class MotorcycleGarage implements VehicleGarage {

    @Override
    public IVehicle getVehicle() {
        return new Motorcycle();
    }
}

上面代码重用了简单工厂实现方式的交通接口以及摩托车和汽车的实现类。代码中有 2 个车库,一个是汽车车库 CarGarage,一个是摩托车库 MotorcycleGarage。如果小明要骑自行车,只需要建一个自行车车库,完全不用去修改汽车车库或者摩托车车库,就非常符合开闭原则,扩展性大大的提高。

总结

工厂方法模式可以说在你能想到的开源框架源码中必定会使用的一个设计模式,因为开源框架很重要一点就是要有扩展性,而工厂方法模式恰恰具有可扩展性。弄懂了工厂方法模式,以后看开源代码就很得心应手啦。

参考资料:《大话设计模式》、《Java设计模式》、《设计模式之禅》、《研磨设计模式》、《Head First 设计模式》

希望文章对您有所帮助,设计模式系列会持续更新。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LieBrother 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP设计模式——工厂方法
译者:Lemon黄 来源:https://www.startutorial.com/articles/view/understanding-design-patterns-factory-method
Lemon黄
2019/11/06
3750
C# 一分钟浅谈:工厂模式与抽象工厂模式
在面向对象编程中,设计模式是一种常用的方法来解决特定问题。本文将重点介绍两种常见的创建型设计模式——工厂模式和抽象工厂模式,并通过C#代码示例进行详细解释。
Jimaks
2024/10/22
2160
创建型模式:单例模式
Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)
LieBrother
2019/03/28
6360
创建型模式:单例模式
设计之禅——工厂方法
我们生活中有许许多多的工厂,为商家提供产品,而我们开发者口中所谈论的工厂方法模式产生灵感也是来源于此,结合生活中的实例我们可以非常轻松的理解该模式。它是一种创建型设计模式,也是项目开发中用的最多的设计模式之一,用于对象的创建。
夜勿语
2020/09/07
2600
创建型模式之门—简单工厂
在我们没有接触到工厂模式(简单工厂、工厂方法模式、抽象工厂模式)之前,我们实例化对象唯一的方法就是通过“new”关键字来完成。但是,大量的使用“new”关键字来实例化对象会违背一些设计原则,因为代码与具体的类型绑在一起,从而导致过多的依赖于细节而非抽象,这样代码就很难适应需求变化。
Miloce
2022/09/28
1520
创建型模式之门—简单工厂
【设计模式】-创建型模式-第2章第2讲-【工厂模式】
2.1、案例场景:假设有一个汽车工厂,目前只生产两种车型,小型跑车和大型家用车。顾客决定买小还是大型。
跟着飞哥学编程
2022/12/02
2910
Java 设计模式最佳实践:二、创建型模式
本章的目的是学习创造模式。创造模式是处理对象创造的模式。在本章中,我们将介绍以下主题:
ApacheCN_飞龙
2022/09/08
4470
工厂方法模式
上文描述了简单工厂模式,但是简单工厂模式并不属于23种设计模式。所以本文我们介绍简单工厂模式的高级实现。在此之前先看一下简单工厂模式所存在的问题。预留问题:
乱敲代码
2020/05/21
3670
JavaScript设计模式之工厂模式
工厂模式是一种最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。因为工厂模式就相当于创建实例对象的new,在JavaScript中通常会使用new关键字来实例化对象,如A: a=new A(), 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
用户6167509
2019/09/04
4380
【C++】设计模式:工厂模式
工厂模式的实现方式有简单工厂模式、工厂方法模式、抽象工厂模式,每个实现方式都存在优和劣。
DevFrank
2024/07/24
2880
【设计模式】工厂方法模式
在前面的博客中我们已经简单介绍了什么是简单工厂模式,需要详细了解的可以看一下这个博客 》【设计模式】简单工厂模式《
小王不头秃
2025/03/01
1001
设计模式(十二)享元模式
如果系统中可能存在大量相同的对象,那么我们可以建立缓存池之类的东西,将这些重复对象进行复用。这种设计模式就是享元模式。
乐百川
2022/05/05
2420
FactoryMethod工厂方法模式(创建型模式)
整个抽象的游戏设施建造系统相对变化较慢,本例中只有一个Build的创建方法,而Build内部的方法实现,该实现依赖与各种具体的实现,而这些实现变化的非常频繁,现在虽然只有现代风格和古典风格的房屋和道路的构建,而将来可能会卡通风格、另类风格等各种各样的对象加入到Build方法中来渲染游戏的背景.
郑小超.
2018/10/18
3280
FactoryMethod工厂方法模式(创建型模式)
23种设计模式(2):工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
全栈程序员站长
2022/07/09
2120
23种设计模式(2):工厂方法模式
设计模式系列| 工厂方法模式
工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
用户7656790
2021/04/13
2510
设计模式系列| 工厂方法模式
我通过三个故事终于学明白了三种工厂模式
接下来创建一个工厂类,功能是提供给用户的出行的方式,用户只需要告诉工厂类他需要什么方式就好了。
手撕代码八百里
2020/07/29
4850
设计模式之工厂方法模式
工厂方法模式(Factory Method Pattern) 隶属于设计模式中的创建型模式,前面的简单工厂模式是工厂方法模式的简化版,因此两者在很多方面都是相似的。
Dylan Liu
2019/08/07
4470
创建型模式:抽象工厂
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
LieBrother
2019/04/02
4110
创建型模式:抽象工厂
设计模式之工厂方法模式(创建型)
工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改工厂角色的情况下,引进新的产品。
SmileNicky
2019/01/17
3050
设计模式 (5)——工厂方法模式(Factory Method,创建型)
使用设计模式可以提高代码的可复用性、可扩充性和可维护性。工厂方法模式(Factory Method Pattern)属于创建型模式,定义一个创建对象的接口函数,但由子类决定实例化某一个类,让工厂类把实例化推迟到子类。
恋喵大鲤鱼
2018/08/03
3900
设计模式 (5)——工厂方法模式(Factory Method,创建型)
相关推荐
PHP设计模式——工厂方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档