工厂模式

定义

工厂模式属于创建类型模式的一种,主要适用于创建多个简单对象。
其最初的设计中,包含如下角色:
抽象产品角色:它一般是具体产品继承的父类或者实现的接口
具体产品:需要生成的目标对象
产品工厂:负责根据传入的标志生成相应的产品对象
工厂模式中分为三种实现,简单工厂,工厂方法和抽象工厂,随着产品和工厂的关系解偶而逐步降低类之间的耦合度,后面会详细解释相应的实现

简单工厂

public class BMWCar extends Car {
    @Override
    void createWheel() {}

    @Override
    void createEngine() { }

    @Override
    void createElectricalEquipment() {}

    @Override
    void createBody() {}
}
public class JeepCar extends Car {
    @Override
    void createWheel() {}

    @Override
    void createEngine() {}

    @Override
    void createElectricalEquipment() {}

    @Override
    void createBody() {}
}
/**
     * 访问入口
     * 当新增一个车种时必然会修改当前工厂方法
     */
    public static Car createCar(int type){
        switch (type){
            case 1:
                return new BMWCar();
            case 2:
                default:
                    return new JeepCar();
        }
    }

上述三个类就构成了一个简单工厂,可以发现其就是简单的满足了定义的三个基本角色:抽象产品+实际产品+工厂,这样的方式隐藏者工厂和产品的强耦合关系(依赖具体的实现类型),即工厂的生产能力是固定的,目前只能生产BMWCar和JeepCar,如果需要生产其他产品,则需要改动createCar方法。当然,简单工厂是可以使用反射来清除强耦合关系的,适当情景下可以采用反射来实现。

工厂方法

public abstract class FactoryCar {
    abstract Car create();
}
public class JeepFacory extends FactoryCar {
    @Override
    Car create() {
        return new JeepCar();
    }
}
public class BMWFactory extends FactoryCar {
    @Override
    Car create() {
        return new BMWCar();
    }
}

上述是工厂方法模式的简单实例,其中出现的四个角色分别是抽象产品+实现产品+抽象工厂+实现工厂,工厂方法和简单工厂的区别就是抽离了工厂角色,将工厂和产品从1:n变成了1:1,优点是隔离了工厂之间的联系,新增产品时不需要改动原有的工厂类和产品类,缺点是每次新增产品都需要新增相应的工厂,导致会出现很多类。像Glide库中就大量使用了该模式,导致其存在大量的工厂,一不小心你就找错了具体的工厂。

抽象工厂

public abstract class AbstractFactory {
    abstract Engine createEngine();
    abstract Wheel createWheels();
}
public class BMWFactoryImpl extends AbstractFactory {
    @Override
    Engine createEngine() {
        return new Engine() {};
    }

    @Override
    Wheel createWheels() {
        return new Wheel() {};
    }
}

上述是一个简单的抽象工厂,讲述了每个具体的工厂可以提供不同型号的汽车配件。其中已经没有车这个概念了,对应的车被细化分解了,至此你会发现,工厂模式的演变之路:
1.工厂和产品强耦合,
2.解偶工厂和产品的关系,工厂单一职责
3.细分产品模块,工厂提供单一功能的组件,客户端来组装

总结

使用设计模式的时候,关键还是看我们抽象化的能力和留有余地的能力,当侧重点不同时其抽象的方向可能也会有出入,比如车的行为和属性是非常多的,而且其实在不断变化的,现有的抽象可能满足不了变化,所以需要给自己留下变化的余地。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。通常我们所说的工厂模式是指工厂方法模...
    zfylin阅读 5,129评论 0 7
  • 摘录 设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,ne...
    西江月阅读 3,359评论 0 2
  • 设计原则: 要依赖抽象,不要依赖具体类 目录 本文的结构如下: 什么是抽象工厂模式 为什么要用该模式 模式的结构 ...
    w1992wishes阅读 4,829评论 0 6
  • 简单工厂模式(SimpleFactoryPattern) 1.定义 简单工厂模式又叫静态方法模式(工厂类定义了一个...
    luoqiang108阅读 2,682评论 0 0
  • 太平歌词请跟我一起唱:葱哎儿丝儿~姜哎儿丝儿~胡萝卜丝儿,还有白菜丝儿~~豆腐丝儿,大虾仁儿,香油白面包饺子儿呀,...
    星照嫣红阅读 3,555评论 0 0

友情链接更多精彩内容