2

设计模式——工厂模式

 3 years ago
source link: https://segmentfault.com/a/1190000041080669
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

1. 工厂模式概述

在工厂模式中,创建对象不会对外界暴露创建逻辑,而是通过使用一个共同的接口来获取新创建的对象。

在工厂模式中,不需要外界手动创建一个实例,而是通过调用对象工厂的方法,返回该类的实例。

比如我现在想获取一个产品,我只需要调用这个产品的工厂的方法就可以了。

(1) 适用情况

需要根据不同的条件,创建不同的实例对象时,可以考虑使用工厂模式。

(2) 优点

  1. 对于调用者来说,不必关心实例的创建方式,这样可以屏蔽产品的具体实现
  2. 拓展性高,如果需要增加一个产品,只需要拓展一个工厂类就可以

(3) 缺点

如果产品过多,则工厂类也会过多,增加了系统的复杂度。

2. 工厂模式实例

现在我们需要一个汽车工厂,用来创建不同品牌的汽车对象。

(1) 先声明一个汽车接口

public interface Car {
    void declare();
}

(2) 创建各个品牌汽车的实现类

public class Benz implements Car{
    @Override
    public void declare() {
        System.out.println("我是一辆奔驰。");
    }
}

public class BMW implements Car{
    @Override
    public void declare() {
        System.out.println("我是一辆宝马。");
    }
}

public class Audi implements Car{
    @Override
    public void declare() {
        System.out.println("我是一辆奥迪。");
    }
}

(3) 创建汽车工厂

public class CarFactory {
    /**
     * 生产汽车
     *
     * @param brand 汽车品牌
     * @return 汽车
     */
    public Car buildCar(CAR_BRAND brand) {
        switch (brand) {
            case BENZ:
                return new Benz();
            case BMW:
                return new BMW();
            case AUDI:
                return new Audi();
            default:
                return null;
        }
    }
}

enum CAR_BRAND {
    BENZ,
    BMW,
    AUDI
}

(4) 使用汽车工厂生产汽车

public class FactoryDemo {
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        // 生产一辆奔驰
        Car benz = carFactory.buildCar(CAR_BRAND.BENZ);
        benz.declare();

        // 生产一辆宝马
        Car bmw = carFactory.buildCar(CAR_BRAND.BMW);
        bmw.declare();

        // 生产一辆奥迪
        Car audi = carFactory.buildCar(CAR_BRAND.AUDI);
        audi.declare();
    }
}

运行结果:
image.png

3. 一些思考

现在我们的工厂已经能生产三种品牌的汽车了,但是为了支持国产,我们还要生产比亚迪、小鹏等。
此时我们只需要创建它们对应的类,然后稍微调整下工厂就好了。

有人可能会说,看起来工厂模式和直接new感觉区别没那么大啊?

那是因为我们的工厂简化了生产过程而已,正常生产汽车时不得生产底盘、悬挂、车身、座椅等等等等,难道这些都要我们自己手动去实现吗。而有了工厂,我们就只需要一个方法就够了。

工厂模式:https://www.runoob.com/design...


Recommend

  • 70
    • coderlengary.github.io 6 years ago
    • Cache

    设计模式之工厂模式

    简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 它有这三种角色 Factory:工厂类,它负责实现创...

  • 43

  • 56
    • www.tuicool.com 5 years ago
    • Cache

    [go设计模式]简单工厂模式

    优点 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象...

  • 39
    • chenjiabing666.github.io 5 years ago
    • Cache

    设计模式:工厂方法模式

    工厂方法模式是所有设计模式中比较常用的一种模式,但是真正能搞懂用好的少之又少,Spring底层大量的使用该设计模式来进行封装,以致开发者阅读源代码的时候晕头转向。 今天陈某分别从以下五个方面详细讲述一下工厂方法...

  • 21
    • www.cnblogs.com 5 years ago
    • Cache

    设计模式——抽象工厂模式

    目录 设计模式——抽象工厂模式 2. 示例1-使用工厂模式实现对不同数据库的操作 3. 示例2-多数据库且多表操作 4. 重构示例2-使用简单工厂改进抽象工厂 5. 重构...

  • 33
    • jiajunhuang.com 4 years ago
    • Cache

    Go设计模式:简单工厂模式

    原始的工厂模式太过于繁冗,我几乎不用。但是简单工厂模式是经常用到的,比如: def get_duck(color): if color == "yello": return YelloDuck() elif color == "blue": return BlueDuck() else:...

  • 36

  • 12
    • rollingstarky.github.io 4 years ago
    • Cache

    Python 设计模式——工厂模式

    Python 设计模式——工厂模式 发表于 2020-12-22 ...

  • 6
    • segmentfault.com 4 years ago
    • Cache

    设计模式-工厂模式

    参考资料 图解设计模式 大话设计模式 设计模式之禅 github我见过最好...

  • 17
    • 微信 mp.weixin.qq.com 4 years ago
    • Cache

    设计模式系列| 工厂方法模式

    大家好,我是狼王,一个爱打球的程序员 ❝ 这是设计模式的第二篇,我们都知道 「工厂模式」 有三种, 「简单工厂,工厂方法,抽象工厂」 ,这篇让我们来认识一下

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK