Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
工厂模式出现的原因
在java中,创建一个对象最简单的方法就是使用new关键字。但在一些复杂的业务逻辑中,创建一个对象不只需要new一行代码就成了,可能需要一些列的初始化设置,或先创建一些辅助对象来创建这个对象。
在这种场景中,如果需要多次创建这种对象,那每次都要写很多代码。工厂模式的产生就是为了解决这种问题。
工厂模式厉害之处就在于:你不需要知道创建对象的细节就可以轻松的创建你想要的对象,并且产品和工厂是解耦的。
3种工厂模式介绍
1、简单工厂模式
1个具体工厂类,1个抽象产品类,多个具体产品类
每个工厂可以创建多个产品实例,当需要创建新产品的时候,需要修改工厂类,不符合java开闭原则
用户需要什么类型的产品,告诉工厂类,工厂类就创建什么类型的产品实例
2、工厂方法模式
1个抽象工厂类,多个具体工厂类,1个抽象产品类,多个具体产品类
每个工厂只能创建1个产品实例,当需要创建新产品的时候,需要扩展抽象工厂类,而不需要修改,符合java开闭原则
用户需要什么类型的产品,就从什么类型的工厂生产
3、抽象工厂模式
1个抽象工厂类,多个具体工厂类,多个抽象产品类,多个抽象产品类
每个工厂可以创建多个产品实例,当需要创建新产品的时候,需要扩展抽象工厂类,而不需要修改,符合java开闭原则
用户需要什么类型的产品,就从什么类型的工厂生产
用于生产一组相关或者相互依赖的产品
下面以工厂生产宝马车为例子开始具体介绍这3种工厂模式
一、简单工厂模式
需求:用户需要宝马车,并希望工厂根据自己提出的类型可以生产不同类型的宝马车
public abstract class BMW {}
public class BMW320 extends BMW {}
public class BMW520 extends BMW {}
public class BMWFactory {
BMW createBMW(Integer type){
if(type == 320){
return new BMW320();
}else if(type == 520){
return new BMW520();
}else{
return null;
}
}
}
public class Customer {
public static void main(String[] args) {
BMWFactory bmwFactory = new BMWFactory();
BMW myBMW320 = bmwFactory.createBMW(320); //告诉工厂自己需要什么类型的产品
BMW myBMW520 = bmwFactory.createBMW(520);
}
}
特点:产品和工厂完全耦合,当需要生产新产品的时候,必须修改工厂类的create()方法,违背了java对扩展开放,对修改关闭的原则
二、工厂方法模式
需求:我不希望只有一个工厂来生产所有的宝马车,我希望每种宝马车都由其对应的工厂来生产
public abstract class BMW {}
public class BMW320 extends BMW {}
public class BMW520 extends BMW {}
public abstract class BMWFactory {
abstract BMW createBMW();
}
public class BMW320Factory extends BMWFactory {
@Override
BMW createBMW() {
return new BMW320();
}
}
public class BMW520Factory extends BMWFactory {
@Override
BMW createBMW() {
return new BMW520();
}
}
public class Customer {
public static void main(String[] args) {
BMWFactory bmw320Factory = new BMW320Factory();
BMWFactory bmw520Factory = new BMW520Factory();
BMW bmw320 = bmw320Factory.createBMW(); //需要什么类型的产品,就从什么类型的工厂来生成
BMW bmw520 = bmw520Factory.createBMW();
}
}
类结构图

特点:产品和工厂完全解耦,当需要生产新产品的时候,只需要扩展新工厂。弊端也很明显,由于每种工厂只生产1中产品,随着新产品越来越多,新工厂也会越来越多
三、抽象工厂模式
需求:用户希望在不同类型的宝马车上可以有不同类型的引擎或空调,如宝马320中安装引擎A和空调A,宝马520中安装引擎B和空调B
引擎类
public abstract class Engine {
abstract public String show();
}
public class EngineA extends Engine {
@Override
public String show() {
return "EngineA";
}
}
public class EngineB extends Engine {
@Override
public String show() {
return "EngineB";
}
}
空调类
public abstract class AirCondition {
abstract public String show();
}
public class AirConditionA extends AirCondition {
@Override
public String show() {
return "AirConditionA";
}
}
public class AirConditionB extends AirCondition {
@Override
public String show() {
return "AirConditionB";
}
}
宝马车类
public abstract class BMW {
private Engine engine;
private AirCondition aircondition;
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public AirCondition getAircondition() {
return aircondition;
}
public void setAircondition(AirCondition aircondition) {
this.aircondition = aircondition;
}
public abstract String show();
}
public class BMW320 extends BMW {
@Override
public String show() {
return "我是BMW320,我的引擎:" + getEngine().show() + ",我的空调:" + getAircondition().show();
}
}
public class BMW520 extends BMW {
@Override
public String show() {
return "我是BMW520,我的引擎:" + getEngine().show() + ",我的空调:" + getAircondition().show();
}
}
工厂类
public abstract class BMWFactory {
abstract BMW createBMW();
abstract Engine createEngine();
abstract AirCondition createAirCondition();
}
public class BMW320Factory extends BMWFactory {
@Override
BMW createBMW() {
BMW bmw320 = new BMW320();
Engine engineA = createEngine();
AirCondition airConditionA = createAirCondition();
bmw320.setEngine(engineA);
bmw320.setAircondition(airConditionA);
return bmw320;
}
@Override
Engine createEngine() {
return new EngineA();
}
@Override
AirCondition createAirCondition() {
return new AirConditionA();
}
}
public class BMW520Factory extends BMWFactory {
@Override
BMW createBMW() {
BMW bmw520 = new BMW520();
Engine engineB = createEngine();
AirCondition airConditionB = createAirCondition();
bmw520.setEngine(engineB);
bmw520.setAircondition(airConditionB);
return bmw520;
}
@Override
Engine createEngine() {
return new EngineB();
}
@Override
AirCondition createAirCondition() {
return new AirConditionB();
}
}
用户类
public class Customer {
public static void main(String[] args) {
BMWFactory bmw320Factory = new BMW320Factory();
BMW bmw320 = bmw320Factory.createBMW();
System.out.println(bmw320.show());
BMWFactory bmw520Factory = new BMW520Factory();
BMW bmw520 = bmw520Factory.createBMW();
System.out.println(bmw520.show());
}
}
类结构图

运行结果
我是BMW320,我的引擎:EngineA,我的空调:AirConditionA
我是BMW520,我的引擎:EngineB,我的空调:AirConditionB
工厂方法模式和抽象工厂模式比较
工厂方法模式中,只有一个抽象产品类,每个工厂只能生产对应类型的产品实例
抽象工厂模式中,有多个抽象产品类,每个工厂可以生产多种类型的产品实例
总结
无论是哪种工厂模式,它们在形式和特点上都是相似的,他们的特点都是为了使产品和工厂解耦。在使用时不必在意具体是工厂方法模式还是抽象工厂模式,因为有时你会发现,明明使用的是工厂方法模式,当新需求来临,对代码稍加扩展或修改,加入一个新产品或方法后,由于产品构成了不同等级的产品族,就变成抽象工厂模式了。而在抽象工厂模式中,当减少一个产品或方法使得工厂提供的产品不再构成产品族后,它就演变成了工厂方法模式。
所以在使用工厂模式时,只需要关心是否降低了耦合度就ok了。
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2biv3j8ly5xc8
Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)的更多相关文章
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- 设计模式3---工厂模式(Factory Pattern简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式
本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...
- Java设计模式之简单工厂、工厂方法和抽象工厂
在前面的学习中(参见前面的博客),我们学到了很多OO原则: 封装变化 多用组合,少用继承 针对接口/超类编程,不针对实现编程 松耦合 开闭原则 让我们从一个简单的类开始,看看如何将之改造成符合OO原则 ...
- c# 设计模式 之:简单工厂、工厂方法、抽象工厂之小结、区别
很多时候,我发现这三种设计模式难以区分,常常会张冠李戴闹了笑话.很有必要深入总结一下三种设计模式的特点.相同之处和不同之处. 1 本质 三个设计模式名字中都含有“工厂”二字,其含义是使用工厂(一个或一 ...
- 简单工厂 VS 工厂方法 VS 抽象工厂
说到设计模式.自然少不了简单工厂模式.工厂方法和抽象工厂这三姐妹. 它们之间可谓是各有所长,术业专攻啊!这篇博客来简单的梳理一下三者之间的关系. 那么工厂又是什么意思呢?结合三者的特点,我觉得能够这样 ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- Java设计模式:Simple Factory(简单工厂)模式
概念定义 简单工厂(Simple Factory)模式,又称静态工厂方法(Static Factory Method)模式,即定义一个工厂类,根据传入的不同参数创建不同的产品实例,这些实例对象具有共同 ...
- head first 设计模式笔记4-工厂模式(简单工厂、工厂方法、抽象工厂)
1.简单工厂模式 Pizza public abstract class Pizza { abstract void prepare(); abstract void bake(); abstract ...
随机推荐
- 计算CPU的MIPS
如图: MIPS=主频/CPI*(10^6), 其中CPI的计算公式为CPI=总的时钟周期数/总的指令数 CPI=(0.5a*2+0.2a*3+0.1a*4+0.2a*5)/a=3
- 升讯威微信营销系统开发实践:微信接口的 .NET 封装
GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...
- 1.9 From Native to HTML5
The mobile technology has become more and more mature, and it has evolved from a ridiculous situatio ...
- 【安富莱】【RL-TCPnet网络教程】第11章 RL-TCPnet调试方法
第11章 RL-TCPnet调试方法 本章节为大家讲解RL-TCPnet的调试方法,RL-TCPnet的调试功能其实就是通过串口打印实时监控运行状态.而且RL-TCPnet的调试设置比较简单 ...
- 微服务架构-选择Spring Cloud,放弃Dubbo
Spring Cloud 在国内中小型公司能用起来吗?从 2016 年初一直到现在,我们在这条路上已经走了一年多. 在使用 Spring Cloud 之前,我们对微服务实践是没有太多的体会和经验的.从 ...
- js 动态生成背景图 GeoPattern
以前有个想法,能不能用JS动态创建CANVAS绘制图案当网页背景,在网络发现有现成的别人已经实现的:GeoPattern 代码如下: <!DOCTYPE html> <html> ...
- Web前端-Vue.js必备框架(四)
Web前端-Vue.js必备框架(四) 计算属性: <div id="aaa"> {{ message.split('').reverse().join('') }} ...
- the python challenge闯关记录(0-8)
0 第零关 2**38 = 274877906944 下一关的url:http://www.pythonchallenge.com/pc/def/274877906944.html 1 第一关 移位计 ...
- http初探
http超文本传输协议 一.版本差异: 版本分0.9 1.0 1.1 2.0 http0.9/1.0已经过时:目前主要是1.1版本的,2.0版本的还没普及. http1.1 ----在同 ...
- java线程阻塞唤醒的四种方式
java在多线程情况下,经常会使用到线程的阻塞与唤醒,这里就为大家简单介绍一下以下几种阻塞/唤醒方式与区别,不做详细的介绍与代码分析 suspend与resume Java废弃 suspend() 去 ...