23种设计模式第二篇:java工厂模式

定义:

工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

工厂模式根据抽象程度的不同分为三种:

简单工厂模式(也叫静态工厂模式)

工厂方法模式(也叫多形性工厂)

抽象工厂模式(也叫工具箱)

简单工厂模式

实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

工厂方法模式

工厂方法是粒度很小的设计模式,因为模式的表现只是一个抽象的方法。 提前定义用于创建对象的接口,让子类决定实例化具体的某一个类,即在工厂和产品中间增加接口,工厂不再负责产品的创建,由接口针对不同条件返回具体的类实例,由具体类实例去实现。

抽象工厂模式

当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品对象。它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。

工厂方法模式应该在实际中用的较多,我们以工厂方法模式举例(例子来源百度,帮助理解)

抽象的产品类:定义car  交通工具类

public interface Car {

void gotowork();

}

定义实际的产品类,总共定义两个,bike 和bus 分别表示不同的交通工具类

public class Bike implements Car {

@Override

public void gotowork() {

System.out.println("骑自行车去上班!");

}

}

public class Bus implements Car {

@Override

public void gotowork() {

System.out.println("坐公交车去上班!");

}

}

定义抽象的工厂接口

public interface ICarFactory {

Car getCar();

}

具体的工厂子类,分别为每个具体的产品类创建不同的工厂子类

public class BikeFactory implements ICarFactory {

@Override

public Car getCar() {

return new Bike();

}

}

public class BusFactory implements ICarFactory {

@Override

public Car getCar() {

return new Bus();

}

}

简单的测试类,来验证不同的工厂能够产生不同的产品对象

public class TestFactory {

@Test

public void test() {

ICarFactory factory = null;

// bike

factory = new BikeFactory();

Car bike = factory.getCar();

bike.gotowork();

// bus

factory = new BusFactory();

Car bus = factory.getCar();

bus.gotowork();

}

}

工厂模式的优点:

1、一个调用者想创建一个对象,只要知道其名称就可以了,降低了耦合度。

2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。使得代码结构更加清晰。

3、屏蔽产品的具体实现,调用者只关心产品的接口。

工厂模式的缺点:

每次增加一个产品时,都需要增加一个具体类和对象实现工厂(这里可以使用反射机制来避免),使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。所以对于简单对象来说,使用工厂模式反而增加了复杂度。

工厂模式的适用场景:

1、  一个对象拥有很多子类。

2、创建某个对象时需要进行许多额外的操作。

3、系统后期需要经常扩展,它把对象实例化的任务交由实现类完成,扩展性好。

关于Java中的工厂模式的一些常见问题:

利用父类的向下转型(使用父类类型的引用指向子类的对象)是可以达到类似于工厂模式的效果的,那为什么还要用工厂模式呢?

把指向子类对象的父类引用赋给子类引用叫做向下转型,如:

Class Student extends Person

Person s = new Student();

s = (Student)person ;

使用向下转型在客户端实例化子类的时候,严重依赖具体的子类的名字。当我们需要更改子类的构造方法的时候,比如增加一个参数,或者更改了子类的类名,所有的new出来的子类都需要跟着更改。

但如果我们使用工厂模式,我们仅仅需要在工厂中修改一下new的代码,其余项目中用到此实例的都会跟着改,而不需要我们手动去操作。(???)

总结:

无论是简单工厂模式、工厂模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。究竟用哪种设计模式更适合,这要根据具体的业务需求来决定。

转自:java知音

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...相关推荐

  1. Spotify敏捷模式详解三部曲第二篇:研发过程

    本文转自:Scrum 中文网 引言 在本系列文章的第一篇,我们介绍了Spotify的敏捷研发团队,以及它独特的组织架构.Spotify的研发团队采用的是一种非常独特的组织架构,如下图所示: 整个研发组 ...

  2. 敏捷开发系列学习总结(14)——Spotify敏捷模式详解三部曲第二篇:研发过程

    分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程 摘要 在本系列文章的第一篇,我们介绍了Spotify的敏捷研发团队,以及它独特的组织 ...

  3. python中提供怎样的内置库、可以用来创建用户界面_Python程序设计案例课堂第二篇核心技术第十章图形用户界面...

    第10章 图形用户界面 Python本身并没有包含操作图形模式(GUI)的模块,而是使用tkinter来做图形化的处理.tkinter是Python的标准GUI库,应用非常广泛.本章重点学习tkint ...

  4. [第二篇]如何在ASP.Net Core的生产环境中使用OAuth保护swagger ui

    在我上篇文章如何在ASP.Net Core的生产环境中保护swagger ui中,我们讨论了如何使用基本身份验证来保护 swagger ui. 使用 OAuth 2.0 和 OpenIdConnect ...

  5. 二、java设计模式之工厂方法+抽象工厂模式(创建型设计模式)

    创建型设计模式-工厂模式和应用 工厂模式介绍: 它提供了一种创建对象的最佳方式,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 例子: 需要购买一辆车,不用管 ...

  6. 二十三种设计模式第二篇--工厂模式

    上篇我们了解了6条设计模式的准则,我相信如果你想了解设计模式,那么你迈出的第一步,我会将上一篇文档里边的6大准则进行一篇有关的代码展示,当然这是题外话了,本篇我们将重点围绕工厂模式进行讲解,天哪,23 ...

  7. 使用 ASP.NET Core, Entity Framework Core 和 ABP 创建N层Web应用 第二篇

    介绍 这是"使用 ASP.NET Core ,Entity Framework Core 和 ASP.NET Boilerplate 创建N层 Web 应用"系列文章的第二篇.以下 ...

  8. 创建型模式:工厂模式(简单工厂+工厂方法+抽象工厂)

    一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!& ...

  9. (创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现

    简介 设计模式是为了解决一些出现的问题设计的解决方案.是长时间经验的总结,是根据不同问题从而提出并且实践出来的解决办法.使用不同的设计模式可以解决不同的问题. 设计模式可以分为三种大类别:分别是创建型 ...

最新文章

  1. duilib 显示内存图片
  2. 阿里新晋 CNCF TOC 委员张磊:“云原生”为什么对云计算生态充满吸引力?
  3. 互联网内容平台到底要用到多少AI技术?
  4. mysql5.7.14多实例安装
  5. Java实现动态加载页面_[Java教程]动态加载页面数据的小工具 javascript + jQuery (持续更新)...
  6. 神经网络与深度学习 吴恩达 第一课第四周 习题
  7. C语言版数据结构及算法_快速排序
  8. 两款网站页面翻译插件
  9. php背景音乐合成,录音加背景音乐要怎么做 如何将两个音乐融合
  10. 结构体的成员偏移地址和字节对齐
  11. Ubuntu 18.04中安装飞行模拟器FlightGear 2018.2.1
  12. PreScan传感器(零)——通用配置
  13. matlab-imresize-最近邻插值、双线性插值、双三次插值学习总结
  14. matlab怎么计算泰尔指数,求助:泰尔指数怎么算呢
  15. Win 10 添加Epson网络打印机后刚开始可以打印,过一会就脱机
  16. 大数据:一张图让你明白什么是大数据
  17. Dedecms错误警告:连接数据库失败,可能数据库密码不对或数据库服务器出错怎么解决?
  18. 流程图软件最新排名,一分钟了解画流程图用什么软件
  19. 微信小程序wx:if与hidden区别
  20. 双向Rsync实时同步

热门文章

  1. CPU的自动调度矩阵乘法
  2. 自动驾驶架构与实现路径
  3. EventBus的粘性事件原理
  4. Python 元组的使用
  5. ADB 查看 crash log
  6. Android自定义View —— TypedArray
  7. Java 数据类型转换
  8. Java开发工具简介
  9. Dundas使用手册
  10. StringUtils.isEmpty和StringUtils.isBlank的区别