02 设计模式 工厂模式
时间:2022-07-22
本文章向大家介绍02 设计模式 工厂模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
工厂模式
静态工厂
使用工厂前如下图:
在使用静态工厂之前我们创造对象都需要自己使用new
关键字进行创建,而使用工厂之后便不需要自己进行创建,直接在工厂中取出成品便可以直接使用,不需要关心创造细节;
例如:我想买一台电脑,在没有工厂的时候我只能自己做,需要什么样的CPU、什么样的内存等等,这些都需要我们自己去配置;而在有了工厂之后便不需要这么麻烦了,我想买电脑,直接去工厂里买就可以,不需要关心是怎么样配置的,只要拿过来就可以直接使用了。
对于消费者来说,可以看到的只有电脑工厂,具体的生产细节对消费者透明
- 代码如下 电脑类: /*电脑的接口类*/ public interface Computer { public String getComputer(); } /*戴尔的电脑*/ public class DellComputer implements Computer{ @Override public String getComputer() { return "Dell"; } } /*联想的电脑*/ public class LenovoComputer implements Computer{ @Override public String getComputer() { return "Lenovo"; } } 电脑工厂类 public class ComputerFactory { public static Computer getComputer(String brand){ if (brand.equals("戴尔")){ return new DellComputer(); }else if(brand.equals("联想")){ return new LenovoComputer(); } return null; } } 在我想要什么样的电脑直接告诉工厂就可以了,它会给我返回我需要的电脑 public static void main(String[] args) { Scanner in = new Scanner(System.in); String comp; do { System.out.print("输入你要买的电脑(退出输入”exit“):"); comp = in.next(); if (comp.equals("exit")) { break; } System.out.println(ComputerFactory.getComputer(comp).getComputer()); } while (true); }
这个工厂看似很好,但是却有一个问题。那就是在添加品牌的时候,必须改动工厂方法,这样就破坏了开闭原则
,这时就需要一种方法来解决这件事情
方法工厂
方法工厂就是在静态工厂的基础上,建立了一个方法工厂;使得每一个类都有一个工厂,在添加类时不会破坏开闭原则
添加新的类时不会影响原有类
代码如下
电脑类:
/*电脑的接口类*/
public interface Computer {
public String getComputer();
}
电脑类及其工厂
/*戴尔的电脑*/
public class DellComputer implements Computer{
@Override
public String getComputer() {
return "Dell";
}
}
/*戴尔的工厂*/
public class DellComputerFactory implements ComputerFactory{
@Override
public Computer getComputer() {
return new DellComputer();
}
}
/*联想的电脑*/
public class LenovoComputer implements Computer{
@Override
public String getComputer() {
return "Lenovo";
}
}
/*联想的工厂*/
public class LenovoComputerFactory implements ComputerFactory {
@Override
public Computer getComputer() {
return new LenovoComputer();
}
}
测试类
public static void main(String[] args) {
Computer computer1 = new DellComputerFactory().getComputer();
Computer computer2 = new LenovoComputerFactory().getComputer();
System.out.println(computer1.getName());
System.out.println(computer2.getName());
}
- Python多线程怎样优雅的响应中断异常
- .NET Core的文件系统[3]:由PhysicalFileProvider构建的物理文件系统
- .NET Core的文件系统[4]:由EmbeddedFileProvider构建的内嵌(资源)文件系统
- 学习July博文总结——支持向量机(SVM)的深入理解(下)
- 在gridview和datagrid里设置列宽
- ASP.NET MVC的Model元数据与Model模板:将”ListControl”引入ASP.NET MVC
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
- 全球15%工作将被自动化,中国1亿人将面临失业
- ASP.NET MVC的Model元数据提供机制的实现
- 清官难断家务事,人工智能却来介入家庭伦理大戏
- 使用Symfony的Console组件构建命令行程序
- 微软编程教育都在搞什么?从code.org到makecode,从Minecraft到Micro:bit
- 谷歌:通往完全自动驾驶之路
- 随时随地部署Kubernetes
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SAP S/4HANA Customer Management(CRM)模块的Partner模型设计
- 使用soapUI消费SAP Cloud for Customer的web service
- 视频上云网关EasyNTS智能云组网如何通过23端口穿透实现远程控制功能?
- 视频上云网关平台EasyCVR登录页开发控制台报net::ERR_CONNECTION_TIMED_OUT错误
- 视频监控系统视频上云解决方案EasyCVR集成海康EHome私有协议系列——开启存储服务
- 设计模式~责任链模式
- 大数据计算的基石——MapReduce
- SPA单页应用的优缺点
- 《JavaScript 模式》读书笔记(7)— 设计模式1
- CenterNet测试推理过程
- Docker学习笔记[nginx]
- MySQL集群搭建方案(PXC)
- Java8——行为参数化传递代码
- 【设计模式系列(二)】彻底搞懂单例模式
- 【设计模式系列(一)】彻底搞懂工厂模式