程序员

设计模式-简单工厂模式

2018-10-19  本文已影响0人  41uLove

简单工厂模式严格来说并不是一个设计模式,反而较像是一种编程习惯。

定义

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

结构

简单工厂

简单工厂包含了一下角色:

场景示例:

简单工厂应用的场景比较对,那么就根据作者的理解,拿作者工作中遇到的场景需求举例:
平台做一个机票代购业务,对接了两个供应商A、B,用户选择完机票后,平台拿着机票去供应商下单。下单时根据机票由那个供应商提供去相应的供应商去下单。

第一步就是定义一个下单接口。

public interface IVender {
    /**
     * 供应商下单方法
     */
    void order();
}

然后分别实现A、B供应商的下单方法。

public class VendorA implements IVender {
    @Override
    public void order() {
        // 业务逻辑处理
        System.out.println("A供应商下单成功,下单时间" + new Date());
    }
}
public class VendorB implements IVender {
    @Override
    public void order() {
        // 业务逻辑处理
        System.out.println("B供应商下单成功,下单时间:" + new Date());
    }
}

接着定义一个工厂类,根据传入的不同参数请求,分别创建不同的供应商实例并返回,若碰到无效的参数,则抛出异常。

public class VendorFactory {

    public static IVender createVendor(String type) {
        switch (type) {
            case "A":
                return new VendorA();
            case "B":
                return new VendorB();
            default:
                throw new RuntimeException("供应商不存在");
        }
    }
}

最后,由我们客户端进行调用:

public class Client {
    public static void main(String[] args) {
        String type = "A";
        IVender iVender = VendorFactory.createVendor(type);
        iVender.order();
    }
}

如果我们都写在一个类中:

public class Client2 {
    private static final String TYPE_A = "A";
    private static final String TYPE_B = "B";

    public static void main(String[] args) {
        String type = "A";
        if (Objects.equals(TYPE_A, type)) {
            // A 供应商下单逻辑处理
            System.out.println("A供应商下单成功,下单时间" + new Date());
        } else if (Objects.equals(TYPE_B, type)) {
            // B 供应商下单逻辑处理
            System.out.println("A供应商下单成功,下单时间" + new Date());
        } else {
            throw new RuntimeException("供应商不存在");
        }
    }
}

第二种写法,供应商下单逻辑较多的话会使客户端变得十分复杂,后期维护起来也将是一个灾难。如果新增加一个供应商,将会对这个类有这较大的改动,很明显的违反了开闭原则迪米特法则

优点

缺点

使用场景

在以下情况下可以使用简单工厂模式:

总结

上一篇 下一篇

猜你喜欢

热点阅读