简单工厂模式

作者: Jackson杰 | 来源:发表于2018-12-07 12:04 被阅读18次

    一 介绍

    所谓工厂,就是生产产品的,那么对于代码的工厂应该怎么理解呢?
    简单工厂模式属于创建性模型,但不属于23种GOF设计模式之一。简单工厂模式虽然不是一个标准的设计模式,但是它常用了,所以掌握好它,就当是学习设计模式的热身吧。

    二 定义

    提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是接口,抽象类,也可以是具体类。

    三 模拟场景

    现在模拟一个汽车的生产工厂,有两个汽车生产工厂,分别生产Audi和Benz汽车,现在用简单工厂模式来模拟实现过程。
    简单工厂模式的UML图如下所示:

    根据UML图,简单工厂模式的实现步骤为

    1 创建一个接口,模拟汽车工厂汽车生产的核心过程。
    public interface CarProduct {
        void productCar();
    }
    
    
    2 创建两个汽车生产工厂,分别生产Audi和Benz汽车。

    Audi生产过程

    public class AudiCarFactory implements CarProduct {
        @Override
        public void productCar() {
            System.out.println("生产了一辆Adui车");
        }
    }
    

    Benz生产过程

    public class BenzCarFactory implements CarProduct {
        @Override
        public void productCar() {
            System.out.println("生产了一辆Benz车");
        }
    }
    

    如果不用简单工厂模式,如果客户需要一台Audi和Benz汽车,则实现过程如下:
    客户端实现:

     // 生产Audi汽车
     AudiCarFactory audiCarFactory=new AudiCarFactory();
     audiCarFactory.productCar();
     // 生产Benz汽车
     BenzCarFactory benzCarFactory=new BenzCarFactory();
     benzCarFactory.productCar();
    

    有什么问题呢,可以看到,两个工厂的实现,都在客户端暴露出来了。假设你有很多的客户,每个客户都是这种操作,如果生产汽车的工艺提升了,也就是说AudiCarFactory这个类发生了变化,导致new的时候必须要变化时,你就不得不到每个客户那修改。实际上是耦合比较高的表现。

    下面用简单工厂实现:

    3 建立生产工厂

    public class CarFactory {
    
        public CarProduct getCarFactory(String type) {
            if (type == null) {
                return null;
            }
            switch (type) {
                case "audi":
                    return new AudiCarFactory();
                case "benz":
                    return new BenzCarFactory();
                default:
                    return null;
            }
    
        }
    
    }
    

    4 客户端实现

     // 得到工厂对象
            CarFactory carFactory=new CarFactory();
            // 生产Audi汽车
            AudiCarFactory audiCarFactory= (AudiCarFactory) carFactory.getCarFactory("audi");
            audiCarFactory.productCar();
            // 生产Benz汽车
            BenzCarFactory benzCarFactory= (BenzCarFactory) carFactory.getCarFactory("benz");
            benzCarFactory.productCar();
    

    以上实现了简单工厂模式,可以看到,在客户端不用进行new操作就可以获取实例,实现了解耦,实现简单,如果要新增一个实例,只要新增一个实现类和修改工厂方法即可,客户端无需关心实现类。

    相关文章

      网友评论

        本文标题:简单工厂模式

        本文链接:https://www.haomeiwen.com/subject/spxicqtx.html