在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之所以叫做工厂模式,是用工厂生产产品来形象的比喻代码中生产对象的过程。总体来说,工厂模式分为以下几种:

简单工厂模式(Simple Factory Pattern)

工厂方法模式(Factory Method Pattern)

抽象工厂模式(Abstract Factory Pattern)

简单工厂模式(Simple Factory Pattern)

我们模拟一种场景,有一家汽车厂(AutoFactory)要生产汽车,现在主要生产小轿车(Car)和大巴车(Bus),那用代码模拟如下:

首先“设计”一个汽车原型(定义汽车接口),这个接口体现了所有汽车的共性:

public interface Auto {

//所有汽车都可以被驾驶

public void drive();

}

接下来我们“设计”两种汽车:小轿车和大巴车:

//小轿车

public class Car implements Auto{

@Override

public void drive(){

System.out.println(“小轿车启动了”);

}

}

//大巴车

public class Bus implements Auto{

@Override

public void drive(){

System.out.println(“大巴车启动了”);

}

}

开始“建厂”了,我们实现一个简单工厂类:

public class AutoFactory{

//生产汽车

public Auto produce(String name){

if("car".equals(name)){

return new Car();

} else if("bus".equals(name)){

return new Bus();

}

}

}

一切就绪,我们开始生产汽车了,先生产一辆小轿车:

AutoFactory factory = new AutoFactory();

Auto car = factory.produce("car");

car.drive();

简单工厂模式实现了生成产品类的代码跟具体的产品实现分离,在工厂类中你可以添加所需的生成产品的逻辑代码,但是问题来了,这不符合“开放-封闭”原则的,也就是说对扩展开放,对修改关闭,如果你要加一个新的汽车类型还需要修改produce方法,为解决这个问题,从而引入了工厂方法模式(Factory Method Pattern)。

工厂方法模式(Factory Method Pattern)

工厂为了扩大市场,现在要开始生产卡车(Truck)了,于是我们设计一辆卡车:

//卡车

public class Truck implements Auto{

@Override

public void drive(){

System.out.println(“卡车启动了”);

}

}

如果按照简单工厂的逻辑,需要修改produce方法(也就是我们要改造已有工厂),这样会影响已有生产,怎么办呢?解决办法是再新建新的工厂:

首先我们“设计”一个工厂原型(工厂接口):

public interface IAutoFactory{

//生产汽车

public Auto produce(String name);

}

然后将原来的工厂简单改造符合设计好的工厂原型(实现接口即可,所有逻辑不变):

public class AutoFactory implements IAutoFactory{

//生产汽车

@Override

public Auto produce(String name){

if("car".equals(name)){

return new Car();

} else if("bus".equals(name)){

return new Bus();

}

}

}

好的,接下来为了生产卡车,我们要为卡车单独建厂:

public class TruckAutoFactory implements IAutoFactory{

//生产卡车

@Override

public Auto produce(String name){

return new Truck();

}

}

开始生产卡车:

IAutoFactory factory = new TruckAutoFactory();

Auto car = factory.produce(null);

car.drive();

这里的抽象工厂中,我们为了减少改造成本,在简单工厂基础上做最小修改,理论上produce参数可以没有,然后为小轿车、大巴车和卡车分别建立工厂,分别生产。这样如果有了新的类型的车,可以不改动之前的代码,新建一个“工厂”即可,做到“开放封闭原则”。

虽然看似类变多了,逻辑复杂了,但是这种改造带来的好处也是显而易见的:不变动老的代码,通过新建工厂类完成新功能的添加,老功能不变,最大限度的避免动了老代码的逻辑导致引入新的bug。

工厂方法的结构图如下:

抽象工厂模式(Abstract Factory Pattern)

我们继续针对汽车工厂说明,由于接下来工厂需要继续扩大规模,开始涉足汽车配件,上层决定涉足汽车大灯业务,针对已有车型生产前大灯。但是如果按照工厂方法模式,需要再继续新建一批工厂,针对每种汽车再建N个工厂,考虑到成本和简单性,针对对已有汽车工厂改造。

首先“设计”大灯原型:

//大灯

public interface Light {

//开灯

public void turnOn();

}

再“设计”小轿车、大巴车和卡车大灯:

//小轿车大灯

public class CarLight implements Light{

@Override

public void tunOn(){

System.out.println(“小轿车大灯亮了”);

}

}

//大巴车大灯

public class BusLight implements Light{

@Override

public void tunOn(){

System.out.println(“大巴车大灯亮了”);

}

}

//卡车大灯

public class TruckLight implements Light{

@Override

public void tunOn(){

System.out.println(“卡车大灯亮了”);

}

}

接下来我们重新“设计”原有的汽车工厂(修改工厂接口或者抽象工厂类)

public interface IAutoFactory{

//生产汽车

public Auto produce();

//生产大灯

public Light produceLight();

}

好的,改造工厂,首先改造小轿车工厂:

public class CarAutoFactory implements IAutoFactory{

//生产汽车

@Override

public Auto produce(){

return new Car();

}

//生产车灯

@Override

public Light produceLight(){

return new CarLight();

}

}

改造大巴车工厂:

public class BusAutoFactory implements IAutoFactory{

//生产汽车

@Override

public Auto produce(){

return new Bus();

}

//生产车灯

@Override

public Light produceLight(){

return new BusLight();

}

}

改造卡车工厂:

public class TruckAutoFactory implements IAutoFactory{

//生产汽车

@Override

public Auto produce(){

return new Truck();

}

//生产车灯

@Override

public Light produceLight(){

return new TruckLight();

}

}

开始生产:

//生产小轿车和小轿车大灯

IAutoFactory factory = new CarAutoFactory();

Auto car = factory.produce();

car.drive();

Light light = factory.produceLight();

light.turnOn();

//生产大巴车和小大巴车大灯

IAutoFactory factory = new BusAutoFactory();

Auto bus = factory.produce();

bus.drive();

Light light = factory.produceLight();

light.turnOn();

//生产卡车和卡大灯

IAutoFactory factory = new TruckAutoFactory();

Auto truck = factory.produce();

truck.drive();

Light light = factory.produceLight();

light.turnOn();

抽象工厂模式中我们可以定义实现不止一个接口,一个工厂也可以生成不止一个产品类,抽象工厂模式较好的实现了“开放-封闭”原则,是三个模式中较为抽象,并具一般性的模式。

抽象工厂模式示意图如下:

参考资料

工厂模式在Hutool中的应用

在Hutool中,Hutool-db模块为了简化和抽象连接池的创建,使用了工厂方法模式,首先定义了DSFactory:

//数据源工厂

public abstract class DSFactory {

//获取数据源

public abstract DataSource getDataSource(String group);

}

然后分别创建了:HikariDSFactory、DruidDSFactory、TomcatDSFactory、DbcpDSFactory、C3p0DSFactory几种常见连接池的工厂实现,这样用户可以很容易的使用对应的连接池工厂创建需要的连接池数据源(DataSource)。

同样,用户也可以自己继承DSFactory实现抽象方法getDataSource来自定义数据源。

在此基础上,对于数据源工厂的创建,又使用了简单工厂模式,代码如下:

private static DSFactory doCreate(Setting setting) {

try {

return new HikariDSFactory(setting);

} catch (NoClassDefFoundError e) {

//ignore

}

try {

return new DruidDSFactory(setting);

} catch (NoClassDefFoundError e) {

//ignore

}

try {

return new TomcatDSFactory(setting);

} catch (NoClassDefFoundError e) {

//ignore

}

try {

return new DbcpDSFactory(setting);

} catch (NoClassDefFoundError e) {

//ignore

}

try {

return new C3p0DSFactory(setting);

} catch (NoClassDefFoundError e) {

//ignore

}

// 默认使用Hutool实现的简易连接池

return new PooledDSFactory(setting);

}

通过try的方式,按照优先级尝试创建对应连接池的工厂类,如果用户没有引入对应连接池库,就会报NoClassDefFoundError异常,从而尝试创建下一个连接池工厂,依次类推,直到发现用户未引入任何连接池库,则使用Hutool默认的简单连接池PooledDSFactory。通过这种方式,简化了用户对连接池的选择配置。

java汽车工厂类方法_Java设计模式学习之工厂模式相关推荐

  1. 海信JAVA开发笔试题_JAVA设计模式之【工厂方法模式】

    看例子 1.TV产品接口,负责播放 public interface TV // TV接口 { public void play(); } 2.TV工厂接口,负责生产产品 public interfa ...

  2. 设计模式学习笔记——工厂(Factory)模式

    设计模式学习笔记--工厂(Factory)模式 @(设计模式)[设计模式, 工厂模式, factory] 设计模式学习笔记工厂Factory模式 基本介绍 工厂案例 类图 实现代码 framework ...

  3. Java设计模式学习 - 模版方法模式策略模式

    个人博客项目地址 希望各位帮忙点个star,给我加个小星星✨ 设计模式-模板方法&策略模式 简单介绍 模板方法模式(Template):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. ...

  4. 设计模式学习-工厂方法模式

    在上文(设计模式学习-简单工厂模式)的模拟场景中,我们用简单工厂模式实现了VISA和MASTERARD卡的刷卡处理,系统成功上线并运行良好,突然有一天老大跑来说,我们的系统需要升级,提供对一般银联卡的 ...

  5. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  6. 设计模式学习之代理模式学习(一)

    设计模式学习之代理模式学习(一) 关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一 ...

  7. 格力电器Java面试题_JAVA设计模式学习--工厂模式

    今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...

  8. Java设计模式学习02——工厂模式

    工厂模式 工厂模式主要是为创建对象提供接口,将创建对象的过程隔离起来,实现了创建者与调用者的分离,提高了程序的灵活性.  核心本质: 实例化对象,用工厂方法代替new操作. 将选择实现类.创建对象统一 ...

  9. Java设计模式学习之工厂模式

    简单工厂模式 我直接上代码代码里有很详细的注解 //简单工厂模式 是由一个工厂对象决定创建出哪种产品 class Factory1 {publicstatic void main(String[] a ...

  10. java的简单工厂模式_java设计模式之简单工厂模式

    简单工厂模式的概念 就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. ...

最新文章

  1. jQuery 选择器模糊匹配
  2. “Paper + Code”才是研读论文的正确姿势 | PaperDaily #02
  3. [原创]Toolbar setNavigationIcon无效
  4. 操作系统:Windows映射网络文件夹的方法介绍
  5. 大揭秘| 我司项目组Gitlab Flow DevOps流程
  6. java云题库测试使用说明 0917
  7. emmc linux 识别分区_linux下给U盘分区并制作文件系统
  8. 在IntelliJ IDEA中clone项目代码
  9. java实现grpc
  10. 优麒麟桌面闪烁_优麒麟 19.10 正式发布—百尺竿头,更进一步
  11. pem加密php,PHP格式化RSA公钥私钥(pem文件)
  12. T(n)=2T(n/2)+n=o(nlogn)
  13. 深入理解java虚拟机(十三)Java Mission Control:可持续在线的监控工具
  14. 【JS】网页悬浮广告及联系QQ客服侧边栏
  15. Android源码分析 - Framework层的Binder(客户端篇)
  16. FTP服务器部署与优化+Received message too long报错
  17. 纯CSS实现文字通知无缝衔接无限循环滚动
  18. 测试开发工程师,年薪100W不过分吧
  19. 绿茶GhostXP SP3纯净版系统虚拟机安装教程
  20. 服务器文件传输过大提示错误,严重文件传输错误

热门文章

  1. php中where条件whereRaw,「laravel whereRaw 和 where(DB::raw(''))」- 海风纷飞Blog
  2. 台式计算机品牌怎么查,教你怎么看电脑主板型号和品牌
  3. WEB学习——JavaScript
  4. Oracle Comment添加表备注和列备注添加和查询comment on table or culumn
  5. 那些小众却深得网友喜爱的导航网站
  6. 同样是VPS,为什么RAKsmart更受欢迎
  7. Unity是如何实现《狂野飙车》实时联网赛车游戏呢?
  8. 智能指针的标准之争:Boost vs. Loki (转)
  9. oracle一次性说清楚,多种分隔符的一个字段拆分多行,再多行多列多种分隔符拆多行,最终处理超亿亿。。亿级别数据量
  10. 【iOS】 app 的优化