设计模式: Java中的工厂设计模式
原文链接
前言
工厂设计模式(Factory Design Pattern)属于创建模式之一,工厂设计模式在JDK,Spring,Stuts被广泛使用
当一个类或者接口有多个子类,并且基于输入返回特定的子类,此时会使用工厂设计模式。这种模式负责从客户端到工厂类的实例化。
让我们首先学习如何在java中实现工厂设计模式,然后我们将研究工厂模式的优势,我们将在JDK中看到一些工厂设计模式的使用。请注意,此模式也称为工厂方法设计模式。
工厂设计模式: 超类
工厂设计模式中的超类可以是接口,抽象类或普通的java类。对于我们的工厂设计模式示例,我们使用带有重写的toString()
方法的抽象超类进行测试。
package com.github.shellhub.model;
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
,具有以下实现。
PC.java
package com.github.shellhub.model;
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;
}
}
Server.java
package com.github.shellhub.model;
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;
}
}
工厂类
既然现在我们准备好了超类和子类,我们可以编写工厂类。以下是基本的实现。
package com.github.shellhub.factory;
import com.github.shellhub.model.Computer;
import com.github.shellhub.model.PC;
import com.github.shellhub.model.Server;
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(type)) {
return new Server(ram, hdd, cpu);
}
return null;
}
}
使用
这是一个简单的测试客户端程序,它使用上面的工厂设计模式实现。
package com.github.shellhub;
import com.github.shellhub.factory.ComputerFactory;
import com.github.shellhub.model.Computer;
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);
}
}
Output:
Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz
工厂设计模式的优点
- 工厂设计模式提供了接口而不是实现的代码方法。
- 工厂模式从客户端代码中删除实际实现类的实例化。工厂模式使我们的代码更健壮,耦合更少,易于扩展。例如,我们可以轻松更改PC类实现,因为客户端程序不知道这一点。
- 工厂模式通过继承提供实现和客户端类之间的抽象。
工厂设计模式在JDK中的应用
-
java.util.Calendar
,ResourceBundle
和NumberFormat getInstanc()
方法使用Factory模式。 - 包装类中的
valueOf()
方法,如Boolean
,Integer
等。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Yii2语言国际化配置
转载 Yii2语言国际化配置 最近想将博客做成支持多语言的,还好Yii2支持这个功能,于是查看了下官方的文档,哎,看了半天不知道干嘛用的,于是各种百度,Google的搜索,最终才明白原来很简单,只是官方写的太复杂 下面介绍下具体的使用步骤,具体介绍我就不写了,官方写比我清楚,我就写怎么使用 第一步 创建i18n配置文件 ./yii message/config @app/config/i18.php // yii 在项目目录下 Yii2创建的时候自动生成的 执行完命令之后会在项目根目录config下创建一个i18n.php文件 为什么要创建这个文件,因为我们为了多语言处理,需要生成一个对应的映射文件,只要生成就好了,稍后的配置程序会自动调用处理 第二步 修改配置规则 打开config/i18n.php,看下生成的配置文件的代码,如下: return [ 'color' => null, 'interactive' => true, 'help' => null, 'sourcePath' => '@yii', 'messagePath' =...
-
下一篇
笔试题解答
/** * @author shishusheng * @date 2018/8/22 23:35 */ import java.util.ArrayList; public class ReverseList { private class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } ArrayList<Integer> arrayList = new ArrayList<>(); public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { if(listNode != null){ this.printListFromTailToHead(listNode.next); arrayList.add(listNode.val); } return arrayList; } } 显然是斐波那契数列 /** * @author shishusheng *...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL数据库在高并发下的优化方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8编译安装MySQL8.0.19
- Dcoker安装(在线仓库),最新的服务器搭配容器使用