文档章节

设计模式之工厂模式

firepation
 firepation
发布于 2018/12/11 22:27
字数 1018
阅读 32
收藏 0

本篇博文主要翻译这篇文章:

https://www.journaldev.com/1392/factory-design-pattern-in-java

由于翻译水平有限,自认为许多地方翻译不恰当,欢迎各位给出宝贵的建议,建议大家去阅读原文。

引言

本篇博文主要用 java 介绍 工厂模式,工厂模式是创建型模式,广泛运用在 JDK 和大量的框架中,比如 Spring 和 Struts。在什么情况下我们会用到它呢?当一个超类具有多个子类,我们需要返回其中一个子类时,就可以使用工厂模式。这个设计模式负责实例化客户端指定的类,实例化的工作由工厂类完成。

了解了一些基本概念后,接下来让我们先学一下如何利用 java 实现工厂模式,然后再去探讨工厂模式的优势。最后我们还会去看一下 JDK 中使用工厂模式的例子。这里顺便提一下,工厂模式也被称为 工厂方法设计模式

父类

在工厂设计模式中,父类可以是一个接口、抽象类或者是一个普通的 java 类。在我们的工厂模式例子中,我们使用一个抽象类作为父类,为了测试的目的,我们还覆写了 toString 方法。

public abstract class Computer{
    public abstract String getRAM();
    public abstract String getHDD();
    public abstract String getCPU();
    
    @Override
	public String toString(){
		return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();
	}
}

子类

子类有 PC 和 Server 两个实现

public class PC extends Computer{
    private String ram;
	private String hdd;
	private String cpu;
	
	public PC(String ram, String hdd, String cpu){
		this.ram=ram;
		this.hdd=hdd;
		this.cpu=cpu;
	}
    
	@Override
	public String getRAM() {
		return this.ram;
	}

	@Override
	public String getHDD() {
		return this.hdd;
	}

	@Override
	public String getCPU() {
		return this.cpu;
	}
}

这两个类都继承了 Computer 类。

public class Server extends Computer{
    private String ram;
	private String hdd;
	private String cpu;
	
	public Server(String ram, String hdd, String cpu){
		this.ram=ram;
		this.hdd=hdd;
		this.cpu=cpu;
	}
	@Override
	public String getRAM() {
		return this.ram;
	}

	@Override
	public String getHDD() {
		return this.hdd;
	}

	@Override
	public String getCPU() {
		return this.cpu;
	}
}

工厂类

现在我们已经将父类和子类准备好了,我们可以开始写工厂类了。这是我们的一个简单实现。

public class ComputerFactory{
    public static Computer getComputer(String type,String ram,String hdd,String cpu){
        if("PC".equalsIgnoreCase(type))
            return new PC(ram,hdd,cpu);
        else if("Server".equalsIgnoreCase))
            return new Server(ram,hdd,cpu);
        return null;
    }
} 

关于工厂模式有几个重要的点需要注意:

  1. 我们需要确保工厂类是单例的(Singleton),或者使用 static 修饰工厂方法。(这是一个疑惑的地方,为什么呢?)
  2. 根据输入参数的不同,我们返回的是不同的子类。getComputer 方法就是工厂方法。

下面是这个例子的类图:

工厂模式

这是对工厂方法的测试:

public class TestFactory{
    public static void main(String[] args){
        Computer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz");
        Computer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz");
        System.out.println("Factory PC Config::"+pc);
        System.out.println("Factory Server Config::"+server);
    }
}

输出的结果是

Factory PC Config::RAM= 2 GB, HDD=500 GC, CPU=2.4 GHz
Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz

工厂模式的优点

  1. 工厂模式提供的是接口而不是实现
  2. 工厂模式将类的实例从客户端中去除,这使我们的代码更加健壮,更加易于扩展。在这个例子中,我们可以很容易的改变 PC 类的实现,因为客户端完全不知道 PC 类的实现。
  3. 工厂模式通过继承提供实现和客户端类之间的抽象。

JDK 中的工厂模式

  1. java.util.Calendar、ResourceBundle 和 NumberFormat 的 getInstance 方法使用了工厂方法,具体的细节可以去看源码。

  2. 基本类型包装类的 valueOf 方法,就比如 Boolean.valueOf(boolean b )`,其实现如下,该方法会根据输入的基本类型来决定输出的实例。

    public static Boolean valueOf(boolean b){
        return (b ? TRUE : FALSE);
    }
    

以上就是对全文的翻译,水平有限,请见谅。

本文转载自:https://www.journaldev.com/1392/factory-design-pattern-in-java

共有 人打赏支持
firepation
粉丝 3
博文 34
码字总数 41236
作品 0
福州
程序员
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.1K
69
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
1
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
3
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
5
0
java 反射

基本概念 RTTI,即Run-Time Type Identification,运行时类型识别。RTTI能在运行时就能够自动识别每个编译时已知的类型。   要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运...

细节探索者
昨天
2
0
推荐转载连接

https://www.cnblogs.com/ysocean/p/7409779.html#_label0

小橙子的曼曼
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部