从零玩转设计模式之简单工厂设计模式-jiandangonchangmoshi
title: 从零玩转设计模式之简单工厂设计模式
date: 2022-12-08 11:31:19.472
updated: 2022-12-11 23:03:34.805
url: https://www.yby6.com/archives/jiandangonchangmoshi
categories:
- 设计模式
tags:
- 设计模式
简单工厂模式是一种创建型设计模式,用于创建单个对象.
它主要由以下3个部分组成:
工厂类(Factory):负责创建单个对象。
抽象产品(Product):定义产品的接口。
具体产品(Concrete Product):实现抽象产品接口,提供具体的产品。
下面是一个简单的例子,展示了如何使用简单工厂模式创建一个汽车:
/**
* 抽象产品(Product) 定义产品 需要实现的功能
*/
public interface Car {
void start();
}
/**
* 工厂类(Factory):负责创建单个对象
*/
public class CarFactory {
public static Car createCar(String carType) {
if (carType.equals("宝马")) {
return new BMW();
} else if (carType.equals("兰博基尼")) {
return new lamborghini();
} else {
return null;
}
}
}
/**
* 具体实现(Concrete Product) 创建车辆
*/
public class BMW implements Car{
@Override
public void start() {
System.out.println("启动宝马");
}
}
/**
* 启动车辆
*/
public class Client {
public static void main(String[] args) {
Car car = CarFactory.createCar("宝马");
car.start();
Car car1 = CarFactory.createCar("兰博基尼");
car1.start();
}
}
总结: 简单的说就是把创建对象交给工厂客户端就不需要自己new直接根据某类型直接拿即可
但是这违背了开闭原则
什么是开闭原则?
开闭原则是面向对象设计中的一项基本原则,指对扩展开放,对修改关闭。
它的主要目的是为了保护软件的可扩展性和可维护性,避免在修改软件的过程中对其他部分造成影响。
开闭原则的主要内容有以下几点:
对扩展开放:软件应该具有良好的扩展性,在不修改原有代码的情况下可以扩展新的功能。
对修改关闭:软件应该具有良好的稳定性,在修改原有代码的情况下不会对其他部分造成影响。
开闭原则的优点:
1. 通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性.。
2. 已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。

开闭原则可以通过以下几种方式来实现:
- 将具体实现和抽象接口分离:通过使用抽象接口隔离具体实现,可以让软件在不修改原有代码的情况下扩展新的功能。
- 使用多态:通过多态的方式来实现抽象接口和具体实现之间的绑定,可以在运行时动态绑定,实现软件的扩展性。
- 使用模板方法:通过模板方法将算法的步骤固定,而具体实现由子类实现,实现软件的扩展性。
通过开闭原则的实现, - 使用反射:通过客户端传递的对象字节码来创建实例,这样子就不需要进行修改原始工厂代码
/**
* 使用反射实现开闭原则
*/
public static <T> Car createCarOpen(Class<T> tClass) {
Car car = null;
try {
Object instance = Class.forName(tClass.getName()).newInstance();
if (instance instanceof Car) {
car = (Car) instance;
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
return car;
}
简单工厂在源码中的应用
JDk当中Calendar实例的创建

从零玩转设计模式之简单工厂设计模式-jiandangonchangmoshi的更多相关文章
- 从零开始单排学设计模式「简单工厂设计模式」黑铁 III
阅读本文大概需要 2 分钟. 本篇是设计模式系列的第二篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了,也算 ...
- Java设计模式之简单工厂设计模式
简单工厂将业务逻辑部分和界面逻辑部分分离开来,降低了界面逻辑和业务逻辑的耦合度,符合面向对象迪米特法则.下面以一个加法减法运算器为例,各位读者可以自行按照这种设计方式设计出一个小小的运算器. 1.业务 ...
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...
- dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程
*1 dom4j解析器 1)CRUD的含义:CreateReadUpdateDelete增删查改 2)XML解析器有二类,分别是DOM和SAX(simple Api for xml). ...
- (@WhiteTaken)设计模式学习——简单工厂
最近工作比较忙,所以没有怎么写博客,这几天将集中学习一下(厉风行)讲解的设计模式的相关知识,并对主要的代码进行介绍. 言归正传,接下来介绍最简单也是最基础的简单工厂设计模式. 什么是简单工厂? 简单工 ...
- PHP设计模式:简单工厂
示例代码详见https://github.com/52fhy/design_patterns 简单工厂 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例. 也就是使用的 ...
- C#设计模式(2)-简单工厂模式
引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...
- C#设计模式(2)——简单工厂模式(转)
C#设计模式(2)——简单工厂模式 一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...
- java简单工厂设计模式
一.基本定义 /* *简单工厂设计模式: *文字描述理解: * 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式. * 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常 * 都具有共同 ...
- 设计模式之简单工厂模式(Simple Factory)
原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html 今天呢,要学习的设计模式是“简单工厂模式”,这是一个 ...
随机推荐
- 文心一言 VS 讯飞星火 VS chatgpt (94)-- 算法导论9.2 3题
三.用go语言,给出 RANDOMIZED-SELECT的一个基于循环的版本. 文心一言: 在循环中实现 RANDOMIZED-SELECT 的一个版本可以如下所示.这个版本使用 Go 语言编写,利用 ...
- DEDEBIZ禁止发布重复标题文章的方法
修改文件位置 /admin/article_add.php 找到 if (empty($click)) $click = ($cfg_arc_click == '-1' ? mt_rand(1000, ...
- Redis和Memcache区别,优缺点对比(转)
转自 https://www.cnblogs.com/JavaBlackHole/p/7726195.html 1. Redis和Memcache都是将数据存放在内存中,都是内存数据库.不过memca ...
- LVS+keepalived配置高可用架构和负载均衡机制(2)
一.概述 接上文,实际生产场景中,往往存在硬件资源数量的限制,此时需要设置DS节点复用RS节点. 所以往往最常见的架构如下图所示: 3台主机组建真实服务器集群,即3个RS 2个RS兼做DS,构建负载均 ...
- P6066 [USACO05JAN] Watchcow S
prologue 这个题这么水的一个板子题. analysis 这个题目我们正反建两条边,在跑欧拉回路的时候,看这个边是不是被走过,走过就不走,跳过这个边.如果没走,就走这条边并且标记这个边走过了. ...
- CF1676G
题目简化和分析: 求一颗子树的黑白两数是否相等. 我们设黑 \(1\),白 \(-1\),若某一棵子树的权值为 \(0\),说明此刻的黑白个数相等,贡献加一. 从根搜索,每次将值传递给父亲,判断父亲此 ...
- Vue之for循环
Vue中for循环的用法总结如下: 1.基本用法 v-for <!DOCTYPE html> <html lang="en"> <head> & ...
- 每天5分钟复习OpenStack(六)CPU虚拟化<2>
OpenStack是 一个IAAS(基础设施即服务)因此免不了会与硬件打交道.下面我介绍下与CPU强关联的一些知识点.1 什么是超配 2 CPU的个数是怎么统计的 3 vCPU的隔离.绑定 1.超配 ...
- Util应用框架快速入门(4) - 集成测试开发入门
本文演示Util应用框架开发的项目中如何编写集成测试. 准备 完成 Web Api 快速入门,本文将在之前生成的示例项目上讲解集成测试的开发. 测试概述 自动化测试对于Util应用框架的开发非常重要, ...
- 使用 Java 对比两个PDF文档之间的差异
不论是在团队写作还是在个人工作中,PDF 文档往往会经过多次修订和更新.掌握 PDF 文档内容的变化对于管理文档有极大的帮助.通过对比 PDF 文档,用户可以快速找出文档增加.删除和修改的内容,更好地 ...