设计模式 --- 工厂模式

前言

工厂模式(Factory Pattern)是Java中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式是简单工厂模式的衍生,属于GOF23中设计模式中的创建型模式。相对简单工厂模式,可以更好地处理需求的变化。


一、简介

1.定义
工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂模式(Polymorphic Factory),在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化(创建)哪一个类。工厂方式法模式(FactoryMethod),定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。

二、模式分析

1.意图
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

2.模式结构

  • 抽象产品角色(Product):定义产品的接口
  • 具体产品角色(ConcreteProduct) :实现接口Product的具体产品类
  • 抽象工厂角色(Creator) :声明工厂方法(FactoryMethod),返回一个产品
  • 真实的工厂(ConcreteCreator):实现FactoryMethod工厂方法,由客户调用返回一个产品的实例

三、优点与缺点

1.优点

  • 用户只需要关心所需产品对应的工厂即可,无须关心创建细节。
  • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  • 屏蔽产品的具体实现,调用者只关心产品的接口。

2.缺点

  • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度。
  • 同时也增加了系统具体类的依赖,增加的系统的抽象性。

四、应用场景及注意事项

1.应用场景

  • 创建对象需要大量重复的代码。
  • 客户端(应用层)不依赖于产品如何被创建、实现等细节。
  • 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
  • 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
  • 设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。

2.注意事项
作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

五、代码实现

//汽车工厂抽象类
public abstract class CarFactory {

    public abstract Car getCar();

}

public class BYDFactory extends CarFactory {

    @Override
    public Car getCar() {
        return new BYD();
    }
}

public class DasAutoFactory extends CarFactory {

    @Override
    public Car getCar() {
        return new DasAuto();
    }
}

public abstract class Car {

    public abstract void run();
}

public class DasAuto extends Car {

    @Override
    public void run() {
        System.out.println("路上跑的是大众车...");
    }
}


public class BYD extends Car {

    @Override
    public void run() {
        System.out.println("路上跑的是比亚迪...");
    }
}

public class Driver {

    public static void main(String[] args) {
        DasAutoFactory factory = new DasAutoFactory();
        Car car = factory.getCar();
        car.run();

        CarFactory bydFactory = new BYDFactory();
        Car byd = bydFactory.getCar();
        byd.run();

    }

}


六、UML类图

在这里插入图片描述

七、总结

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

八、参考

深入浅出设计模式——工厂模式

感谢阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值