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. 已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。

开闭原则可以通过以下几种方式来实现:

  1. 将具体实现和抽象接口分离:通过使用抽象接口隔离具体实现,可以让软件在不修改原有代码的情况下扩展新的功能。
  2. 使用多态:通过多态的方式来实现抽象接口和具体实现之间的绑定,可以在运行时动态绑定,实现软件的扩展性。
  3. 使用模板方法:通过模板方法将算法的步骤固定,而具体实现由子类实现,实现软件的扩展性。

    通过开闭原则的实现,
  4. 使用反射:通过客户端传递的对象字节码来创建实例,这样子就不需要进行修改原始工厂代码

/**
* 使用反射实现开闭原则
*/
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的更多相关文章

  1. 从零开始单排学设计模式「简单工厂设计模式」黑铁 III

    阅读本文大概需要 2 分钟. 本篇是设计模式系列的第二篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统.所以现在打算重写,加上距离现在也有一段时间了,也算 ...

  2. Java设计模式之简单工厂设计模式

    简单工厂将业务逻辑部分和界面逻辑部分分离开来,降低了界面逻辑和业务逻辑的耦合度,符合面向对象迪米特法则.下面以一个加法减法运算器为例,各位读者可以自行按照这种设计方式设计出一个小小的运算器. 1.业务 ...

  3. Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)

    jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...

  4. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

  5. (@WhiteTaken)设计模式学习——简单工厂

    最近工作比较忙,所以没有怎么写博客,这几天将集中学习一下(厉风行)讲解的设计模式的相关知识,并对主要的代码进行介绍. 言归正传,接下来介绍最简单也是最基础的简单工厂设计模式. 什么是简单工厂? 简单工 ...

  6. PHP设计模式:简单工厂

    示例代码详见https://github.com/52fhy/design_patterns 简单工厂 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例. 也就是使用的 ...

  7. C#设计模式(2)-简单工厂模式

    引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...

  8. C#设计模式(2)——简单工厂模式(转)

    C#设计模式(2)——简单工厂模式   一.引言 这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理 ...

  9. java简单工厂设计模式

    一.基本定义 /* *简单工厂设计模式: *文字描述理解: * 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式. * 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常 * 都具有共同 ...

  10. 设计模式之简单工厂模式(Simple Factory)

    原文地址:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2579100.html 今天呢,要学习的设计模式是“简单工厂模式”,这是一个 ...

随机推荐

  1. 「codeforces - 1621G」Weighted Increasing Subsequences

    link. 一个 dp(拜谢 ly)和切入点都略有不同的做法,并不需要观察啥性质. 原问题针对子序列进行规划,自然地想到转而对前缀进行规划.接下来我们考虑一个前缀 \([1, i]\) 以及一个 \( ...

  2. Apollo2.1.0+Springboot使用OpenApI

    依赖管理 <!-- bootstrap最高级启动配置读取 --> <dependency> <groupId>org.springframework.cloud&l ...

  3. JavaCore extends Plugin

    /******************************************************************************* 2 * Copyright (c) 2 ...

  4. PHP-basename

    basename 定义: basename() 函数返回路径中的文件名部分. 语法: basename(path,suffix) 参数 描述 path 必需.规定要检查的路径 suffix 可选.规定 ...

  5. 【matplotlib 实战】--南丁格尔玫瑰图

    南丁格尔玫瑰图是一种用极坐标下的柱状图或堆叠柱状图来展示数据的图表. 虽然南丁格尔玫瑰图外观类似饼图,但是表示数据的方式不同,它是以半径来表示数值的,而饼图是以扇形的弧度来表达数据的. 所以,南丁格尔 ...

  6. 栈溢出-GOT表劫持测试

    1.目标程序源代码 char name[64]; int main(){ int unsigned long long addr; setvbuf(stdin,0,2,0); setvbuf(stdo ...

  7. 为zabbix穿上一件漂亮的外衣

    zabbix+Grafana 7.0  zabbix的环境已部署好的情况下,zabbix部分-- 略 Grafana简介: 1.Grafana自身并存储数据,数据从其它地方获取.需要配置数据源 2.G ...

  8. C函数指针和回调函数

    函数指针 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: t ...

  9. Lazyload 延迟加载效果(转)

    http://www.cnblogs.com/cloudgamer/archive/2010/02/01/LazyLoad.html Lazyload是通过延迟加载来实现按需加载,达到节省资源,加快浏 ...

  10. 题解 CF690C2

    题目大意: 给你一棵树,求一下直径 题目分析: emm,怎么说吧,就是树的直径的裸板子. 可能有人不大理解,明明是图,你为什么要说是给定一棵树. 大家可以自行验证一下,满足如下两个性质的是否是一棵树: ...