Java常用设计模式--三种工厂模式之简单工厂模式(Simple Factory)
时间:2022-07-23
本文章向大家介绍Java常用设计模式--三种工厂模式之简单工厂模式(Simple Factory),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
严格的说,简单工厂模式并不是23种常用的设计模式之一,它只算工厂模式的一个特殊实现。简单工厂模式在实际中的应用相对于其他2个工厂模式用的还是相对少得多,因为它只适应很多简单的情况。
最重要的是它违背了我们在概述中说的 开放-封闭原则 (虽然可以通过反射的机制来避免,后面我们会介绍到) 。因为每次你要新添加一个功能,都需要在if-else 语句(或者switch-case 语句)中去修改代码,添加分支条件。
适用场景
(1)需要创建的对象较少。
(2)客户端不关心对象的创建过程。
简单工厂模式角色分配:
- 工厂(Factory)角色 :简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
- 抽象产品(Product)角色 :简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
- 具体产品(Concrete Product)角色:简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
举个例子:
奶茶店有各种奶茶,奶茶类别有波霸奶茶、红豆奶茶、 珍珠奶茶等
奶茶店-->工厂(Factory)角色
奶茶-->抽象产品(Product)角色
波霸奶茶、红豆奶茶、 珍珠奶茶-->具体产品(Concrete Product)角色
例子代码:
package com.example.simplefactory;
public interface MilkyTea {
/**
* 制造奶茶
*/
void makeMilkyTea();
}
package com.example.simplefactory;
/**
* 红豆奶茶
*/
public class OrmosiaMilkyTea implements MilkyTea {
@Override
public void makeMilkyTea() {
System.out.println("制作红豆奶茶");
}
}
package com.example.simplefactory;
public class BoBaMilkyTeam implements MilkyTea {
@Override
public void makeMilkyTea() {
System.out.println("制作波霸奶茶");
}
}
package com.example.simplefactory;
public class PearlMilkyTea implements MilkyTea {
@Override
public void makeMilkyTea() {
System.out.println("制作珍珠奶茶");
}
}
package com.example.simplefactory;
public class SimpleFactory {
public static final int TYPE_BB = 1;//波霸奶茶
public static final int TYPE_HD = 2;//红豆奶茶
public static final int TYPE_ZZ = 3;//珍珠奶茶
public static MilkyTea createMilkyTea(int type) {
MilkyTea milkyTea = null;
if(type == TYPE_BB){
milkyTea = new BoBaMilkyTeam();
}else if(type == TYPE_HD){
milkyTea = new OrmosiaMilkyTea();
}else if(type == TYPE_ZZ){
milkyTea = new PearlMilkyTea();
}
return milkyTea;
}
}
package com.example.simplefactory;
public class Test {
public static void main(String[] args) {
MilkyTea milkyTea = SimpleFactory.createMilkyTea(1);
milkyTea.makeMilkyTea();
}
}
我想多增加一种奶茶品种,四季奶青,还需要修改工厂类方法,扩展性差
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 如何真正理解好一个「设计模式」?
- 10 行实现最短路算法
- 深度学习Pytorch检测实战 - Notes - 第6章 单阶经典检测器:YOLO
- 从图片裁剪来聊聊前端二进制
- 【投稿】刀哥:Rust学习笔记 2
- 【每周一库】- JWT的Rust实现
- 【Rust日报】2020-08-15 Rust Nightly 标准库文档已涵盖了每个关键字
- 【Rust日报】2020-08-16 Cranelift现在可以编译rustc,比LLVM的编译速度快7倍!
- 【Rust日报】2020-08-17 浏览器之外的 WebAssembly
- 前沿技术探讨:Rust语言真的安全吗?
- Java、Go和Rust间的比较
- 【文末送书】非常实用的 Python 技巧
- 消息队列:Rabbitmq如何保证不丢消息
- 二叉树:删除节点
- Go之heap