定义

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

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

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

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

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

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

简单工厂模式

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

工厂方法模式

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

抽象工厂模式

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

工厂方法模式应该在实际中用的较多,我们以工厂方法模式举例

(例子来源百度,帮助理解)

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

public interface Car {    void gotowork();
}

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

public class Bike implements Car {@Overridepublic void gotowork() {System.out.println("骑自行车去上班!");}
}
public class Bus implements Car {@Overridepublic void gotowork() {System.out.println("坐公交车去上班!");}
}

定义抽象的工厂接口

public interface ICarFactory {Car getCar();
}

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

public class BikeFactory implements ICarFactory {@Overridepublic Car getCar() {return new Bike();}
}
public class BusFactory implements ICarFactory {
@Overridepublic Car getCar() {        return new Bus();}
}

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

public class TestFactory {@Testpublic void test() {ICarFactory factory = null;// bikefactory = new BikeFactory();Car bike = factory.getCar();bike.gotowork();// busfactory = 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的代码,其余项目中用到此实例的都会跟着改,而不需要我们手动去操作。(???)

总结:

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

23种设计模式(2)-工厂模式相关推荐

  1. 23种设计模式-抽象工厂模式《三国王者》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 定义: 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体 ...

  2. 23种设计模式-抽象工厂模式介绍加实战代码

    1.描述 通俗一点来讲,抽象工厂模式就是在工厂方法模式的抽象工厂类中规范多个同类产品. 工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂,而抽 ...

  3. 23种设计模式之工厂模式学习笔记

    什么是工厂模式? 工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式.该模式用于封装和管理对象的创建,是一种创 ...

  4. 23种设计模式——抽象工厂模式

    目录 抽象工厂模式(AbstractFactory) 产品族 理解 UML图 优缺点 应用场景 抽象工厂模式VS和工厂模式 实例 数据访问(工厂方法) 数据访问(抽象工厂) 用简单工厂改造抽象工厂 C ...

  5. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  6. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  7. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

  8. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

  9. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

  10. 23种设计模式之代理模式

    文章目录 代理模式的定义与特点 代理模式的结构与实现 模式的结构 模式的实现 代理模式的应用场景 代理模式的应用实例 代理模式的扩展 代理模式分类 静态代理 动态代理 在有些情况下,一个客户不能或者不 ...

最新文章

  1. .net multi-threads synchronization : Use Lock effective
  2. mac 下搭建 php + apache + mysql 服务器(cool)
  3. 我是这样发现ISP劫持HTTP请求的
  4. python爬虫背景_利用Python代码实现一键抠背景功能
  5. JAVA反射系列之Method,java.lang.reflect.Method的使用
  6. 企业是否应该实现对客户需求的快速响应_如何做好企业服务?
  7. Java InputStreamReader getEncoding()方法及示例
  8. 第一个Appium脚本
  9. 广东省计算机考试图片大小,广东省计算机等级考试(20190423051419).doc
  10. 1.java数组教程及示例知乎
  11. android+wear独立应用,谷歌更新Android Wear政策:鼓励开发可独立运行的手表应用
  12. python的版本会导致IBus设置(中文输入法)出错
  13. 大数据平台搭建及搭建过程出错解析
  14. ★★★HEU_KMS_Activator_v7.5 (附详细说明文档)
  15. 14讲项目实战内页抽出切换效果的实现
  16. 如何开通电子邮箱的SMTP功能
  17. 什么是Lora Mesh网络
  18. ESP32 串口读取 jy901s 姿态传感器
  19. 自学unity,该不该阻止?
  20. 经典简单的猜数字小游戏

热门文章

  1. 马斯克:挑战纽北赛道的Model S配有7个座椅
  2. 又一个停止申请后才知道的功能?QQ至尊保服务“下线” 已试运营三年
  3. 库克看下!罗永浩深夜再谈收购苹果:还需要点时间
  4. 都是宝宝:北京孩子3成不玩电子游戏睡眠状况最好 江苏孩子起得最早
  5. linux学习杂记_socket编程(含select)
  6. php 添加 redis 扩展模块
  7. 高质量的工程代码为什么难写
  8. 1纸画图边框_日常手帐1月下半月总结:清新、复古、简约风日常手帐排版都有...
  9. csnd ftp服务器端java_数据包取证总结 - osc_r6zeu2c7的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. xlsx怎么设置行高列宽_7米面宽的3栋别墅,两款复式进深达到18米,第一款主体只要16万...