设计模式—— 八 :工厂方法模式

工厂方法模式uml类图 java设计模式 工厂方法模式uml类图,一张图就让你秒懂工厂方法模式 立即下载

什么是工厂方法模式?

工厂方法模式的定义:

Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的 接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)

工厂方法模式的通用类图如图8-1所示:

图8-1:工厂方法模式通用类图

在这里插入图片描述

在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定 义;Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂 ConcreteCreator完成的。

工厂方法模式的扩展比较多,以下是比较通用的工厂方法模式实例:

  • 抽象产品类:
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">abstract</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">Product</span> {
	<span style="color:#a0a1a7"><em>// 产品类的公共方法</em></span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">method1</span>() {
		<span style="color:#a0a1a7"><em>// 业务逻辑处理</em></span>
	}

	<span style="color:#a0a1a7"><em>// 抽象方法</em></span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">abstract</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">method2</span>();

}
</code></span></span>

  • 具体产品类:
    具体的产品类可以有多个,都继承于抽象产品类。
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">ConcreteProduct1</span> <span style="color:#a626a4">extends</span> <span style="color:#4078f2">Product</span>{

	<span style="color:#4078f2">@Override</span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">method2</span>() {
		<span style="color:#a0a1a7"><em>// TODO Auto-generated method stub</em></span>
		
	}

}


<span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">ConcreteProduct2</span> <span style="color:#a626a4">extends</span> <span style="color:#4078f2">Product</span>{

	<span style="color:#4078f2">@Override</span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">method2</span>() {
		<span style="color:#a0a1a7"><em>// TODO Auto-generated method stub</em></span>
		
	}

}

</code></span></span>

  • 抽象工厂类
    抽象工厂类负责定义产品对象的产生。
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">abstract</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">Creator</span> {
	<span style="color:#a0a1a7"><em>/** 创建一个产品对象,其输入参数类型可以自行设置 * 通常为String、Enum、Class等,当然也可以为空   */</em></span> 
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">abstract</span> <T <span style="color:#a626a4">extends</span> <span style="color:#4078f2">Product</span>> T <span style="color:#4078f2">createProduct</span>(Class<T> c);
}
</code></span></span>

  • 具体工厂类
    具体产生一个产品的对象,是由具体的工厂类实现的。
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">ConcreteCreator</span> {
	<span style="color:#a626a4">public</span> <T <span style="color:#a626a4">extends</span> <span style="color:#4078f2">Product</span>> T <span style="color:#4078f2">createProduct</span>(Class<T> c) {
		<span style="color:#986801">Product</span> <span style="color:#986801">product</span> <span style="color:#ab5656">=</span> <span style="color:#0184bb">null</span>;
		<span style="color:#a626a4">try</span> {
			product = (Product) Class.forName(c.getName()).newInstance();
		} <span style="color:#a626a4">catch</span> (Exception e) {
			<span style="color:#a0a1a7"><em>// 异常处理</em></span>
		}
		<span style="color:#a626a4">return</span> (T) product;
	}

}
</code></span></span>

  • 场景类:
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">Client</span> {
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">static</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">main</span>(String[] args) { 
		<span style="color:#986801">Creator</span> <span style="color:#986801">creator</span> <span style="color:#ab5656">=</span> <span style="color:#a626a4">new</span> <span style="color:#4078f2">ConcreteCreator</span>();
		<span style="color:#986801">Product</span> <span style="color:#986801">product</span> <span style="color:#ab5656">=</span> creator.createProduct(ConcreteProduct1.class); 
		<span style="color:#a0a1a7"><em>/** 继续业务处理 */</em></span> }
}
</code></span></span>

Why工厂方法模式?

使用工厂方法模式有以下优点:

  • 良好的封装性,代码结构清晰。一个对象创建是有条件约束的,如一个调用者需 要一个具体的产品对象,只要知道这个产品的类名(或约束字符串)就可以了,不用知道创 建对象的艰辛过程,降低模块间的耦合。
  • 优秀的扩展性:在增加产品类的情况下,只要适当地修改具体 的工厂类或扩展一个工厂类,就可以完成“拥抱变化”。
  • 屏蔽产品类的具体细节:产品类的实现如何变化,调用者都不需要关 心,它只需要关心产品的接口,只要接口保持不变,系统中的上层模块就不要发生变化。因 为产品类的实例化工作是由工厂类负责的,一个产品对象具体由哪一个产品生成是由工厂类 决定的。
  • 解耦:高层模块值需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特法则;也符合依赖倒置原则,只依赖产品类的抽象;同样符合里氏替换原则,使用产品子类替换产品父类。

简单工厂模式

简单工厂模式并不是一个标准的设计模式,但是在实际开发中是非常有用的。

简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的 实例,被创建的实例通常都具有共同的父类。

以女娲造人为例:女娲在不同的场景下分别造出了白种人、黑种人、黄种人。
类图如下:

图8-2:简单工厂模式类图

在这里插入图片描述
 

  • 简单工厂模式中的工厂类
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">HumanFactory</span> {
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">static</span> <T <span style="color:#a626a4">extends</span> <span style="color:#4078f2">Human</span>> T <span style="color:#4078f2">createHuman</span>(Class<T> c) {
		<span style="color:#a0a1a7"><em>// 定义一个生产出的人种</em></span>
		<span style="color:#986801">Human</span> <span style="color:#986801">human</span> <span style="color:#ab5656">=</span> <span style="color:#0184bb">null</span>;
		<span style="color:#a626a4">try</span> {
			<span style="color:#a0a1a7"><em>// 产生一个人种</em></span>
			human = (Human) Class.forName(c.getName()).newInstance();
		} <span style="color:#a626a4">catch</span> (Exception e) {
			System.out.println(<span style="color:#50a14f">"人种生成错误!"</span>);
		}
		<span style="color:#a626a4">return</span> (T) human;
	}
}
</code></span></span>

  • 人类:
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">interface</span> <span style="color:#4078f2">Human</span> {
	<span style="color:#a0a1a7"><em>//每个人种的皮肤都有相应的颜色 </em></span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">getColor</span>(); 
	<span style="color:#a0a1a7"><em>//人类会说话 </em></span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">talk</span>();
}

</code></span></span>

  • 黄色人种类:
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">BlackHuman</span> <span style="color:#a626a4">implements</span> <span style="color:#4078f2">Human</span>{

	<span style="color:#4078f2">@Override</span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">getColor</span>() {
		System.out.println(<span style="color:#50a14f">"黑色人种的皮肤颜色是黑色的!"</span>);
	}

	<span style="color:#4078f2">@Override</span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">talk</span>() {
		System.out.println(<span style="color:#50a14f">"Hey!Man."</span>);	
	}

}
</code></span></span>

  • 白色人种类:
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">WhiteHuman</span> <span style="color:#a626a4">implements</span> <span style="color:#4078f2">Human</span>{

	<span style="color:#4078f2">@Override</span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">getColor</span>() {
		System.out.println(<span style="color:#50a14f">"白肤色"</span>);
	}

	<span style="color:#4078f2">@Override</span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">talk</span>() {
		System.out.println(<span style="color:#50a14f">"Calm down!Guy!"</span>);
	}

}
</code></span></span>

  • 黄色人种类:
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">YellowHuman</span> <span style="color:#a626a4">implements</span> <span style="color:#4078f2">Human</span>{

	<span style="color:#4078f2">@Override</span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">getColor</span>() {
		System.out.println(<span style="color:#50a14f">"黄土地的颜色!"</span>);
	}

	<span style="color:#4078f2">@Override</span>
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">talk</span>() {
		System.out.println(<span style="color:#50a14f">"五湖四海皆兄弟!"</span>);
	}

}
</code></span></span>

  • 女娲造人场景类:
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java"><span style="color:#a626a4">public</span> <span style="color:#a626a4">class</span> <span style="color:#4078f2">NvWa</span> {
	<span style="color:#a626a4">public</span> <span style="color:#a626a4">static</span> <span style="color:#a626a4">void</span> <span style="color:#4078f2">main</span>(String[] args) {
		<span style="color:#a0a1a7"><em>// 女娲第一次造人,火候不足,于是白色人种产生了</em></span>
		System.out.println(<span style="color:#50a14f">"--造出的第一批人是白色人种--"</span>);
		<span style="color:#986801">Human</span> <span style="color:#986801">whiteHuman</span> <span style="color:#ab5656">=</span> HumanFactory.createHuman(WhiteHuman.class);
		whiteHuman.getColor();
		whiteHuman.talk();
		<span style="color:#a0a1a7"><em>// 女娲第二次造人,火候过足,于是黑色人种产生了</em></span>
		System.out.println(<span style="color:#50a14f">"\n--造出的第二批人是黑色人种--"</span>);
		<span style="color:#986801">Human</span> <span style="color:#986801">blackHuman</span> <span style="color:#ab5656">=</span> HumanFactory.createHuman(BlackHuman.class);
		blackHuman.getColor();
		blackHuman.talk(); <span style="color:#a0a1a7"><em>// 第三次造人,火候刚刚好,于是黄色人种产生了</em></span>
		System.out.println(<span style="color:#50a14f">"\n--造出的第三批人是黄色人种--"</span>);
		<span style="color:#986801">Human</span> <span style="color:#986801">yellowHuman</span> <span style="color:#ab5656">=</span> HumanFactory.createHuman(YellowHuman.class);
		yellowHuman.getColor();
		yellowHuman.talk();
	}
}

</code></span></span>

工厂方法模式与IOC/DI

Spring框架对工厂方法模式的应用是非常经典的。

IOC和DI详解

首先看一下什么是IOC和DI:

  • IOC:(InversionofControl)控制反转:

  • DI:(DependencyInjection)依赖注入

带着问题将这两个概念拆解开来:

  • 参与者都有谁:
    一般有三方参与者,一个是某个对象;一个是IOC/DI的容器;另一个是某个对象的外部资源。
    IOC/DI的容器简单点说就是指用来实现IOC/DI功能的一个框架程序;对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,

  • 谁依赖于谁:
    某个对象依赖于IOC/DI的容器

  • 为什么需要依赖:
    对象需要IOC/DI的容器来提供对象需要的外部资源

  • 谁注入于谁:
    IOC/DI的容器 注入 某个对象

  • 到底注入什么:
    注入某个对象所需要的外部资源

  • 谁控制谁:
    IOC/DI的容器控制对象

  • 控制什么:
    主要是控制对象实例的创建

  • 为何叫反转:
    反转是相对于正向而言的,所谓正向——常规情况下的应用程序,如果要在A里面使用C,就直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C,这种情况被称为正向的。所谓反向——就是A类不再主动去获取C,而是被动等待,等待IOC/DI的容器获取一个C的实例,然后反向的注入到A类中。

  • 依赖注入和控制反转是同一概念吗?
    依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。

IOC/DI对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IOC/DI思想中,应用程序就变成被动的了,被动的等待IOC/DI容器来创建并注入它所需要的资源了。
这么小小的一个改变其实是编程思想的一个大进步,这样就有效的分离了对象和它所需要的外部资源,使得它们松散耦合,有利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

工厂方法模式和IOC/DI的联系

SpringBean 的创建是典型的工厂模式,IOC容器实现,就是利用一系列的 Bean 工厂,在 Spring 中有许多的 IOC 容器的实现供用户选择和使用,其相互关系如下:

图8-3:Spring IOC容器相互关系

在这里插入图片描述
 

其中 BeanFactory 作为最顶层的一个接口类,它定义了 IOC 容器的基本功能规范,BeanFactory 有三个子类: ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。最终的 默认实现类是 DefaultListableBeanFactory,实现了所有的接口。定义这么多层次的接口是为了适应不同的场景。例如 ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是这些Bean是有继承关系的 , 也就是每个 Bean 有 可 能 有 父 Bean 。 AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。这四个接口共同定义了 Bean 的集合、Bean 之间的 关系、以及 Bean 行为。

  • 最顶层的BeanFactory接口:
<span style="color:#141418"><span style="background-color:#ffffff"><code class="language-java">ackage org.springframework.beans.factory;

<span style="color:#a626a4">import</span> org.springframework.beans.BeansException;
<span style="color:#a626a4">import</span> org.springframework.core.ResolvableType;
<span style="color:#a626a4">import</span> org.springframework.lang.Nullable;

<span style="color:#a626a4">public</span> <span style="color:#a626a4">interface</span> <span style="color:#4078f2">BeanFactory</span> {
    <span style="color:#986801">String</span> <span style="color:#986801">FACTORY_BEAN_PREFIX</span> <span style="color:#ab5656">=</span> <span style="color:#50a14f">"&"</span>;

    Object <span style="color:#4078f2">getBean</span>(String var1) <span style="color:#a626a4">throws</span> BeansException;

    <T> T <span style="color:#4078f2">getBean</span>(String var1, Class<T> var2) <span style="color:#a626a4">throws</span> BeansException;

    Object <span style="color:#4078f2">getBean</span>(String var1, Object... var2) <span style="color:#a626a4">throws</span> BeansException;

    <T> T <span style="color:#4078f2">getBean</span>(Class<T> var1) <span style="color:#a626a4">throws</span> BeansException;

    <T> T <span style="color:#4078f2">getBean</span>(Class<T> var1, Object... var2) <span style="color:#a626a4">throws</span> BeansException;

    <T> ObjectProvider<T> <span style="color:#4078f2">getBeanProvider</span>(Class<T> var1);

    <T> ObjectProvider<T> <span style="color:#4078f2">getBeanProvider</span>(ResolvableType var1);

    <span style="color:#986801">boolean</span> <span style="color:#4078f2">containsBean</span>(String var1);

    <span style="color:#986801">boolean</span> <span style="color:#4078f2">isSingleton</span>(String var1) <span style="color:#a626a4">throws</span> NoSuchBeanDefinitionException;

    <span style="color:#986801">boolean</span> <span style="color:#4078f2">isPrototype</span>(String var1) <span style="color:#a626a4">throws</span> NoSuchBeanDefinitionException;

    <span style="color:#986801">boolean</span> <span style="color:#4078f2">isTypeMatch</span>(String var1, ResolvableType var2) <span style="color:#a626a4">throws</span> NoSuchBeanDefinitionException;

    <span style="color:#986801">boolean</span> <span style="color:#4078f2">isTypeMatch</span>(String var1, Class<?> var2) <span style="color:#a626a4">throws</span> NoSuchBeanDefinitionException;

    <span style="color:#4078f2">@Nullable</span>
    Class<?> getType(String var1) <span style="color:#a626a4">throws</span> NoSuchBeanDefinitionException;

    String[] getAliases(String var1);
}
</code></span></span>

PCL 点云加权均值收缩 阅读详情

相关推荐

从零到一:手把手教你用DaVinci Configurator配置一个完整的AUTOSAR接口通信实例

本文详细介绍了如何使用DaVinci Configurator工具配置AUTOSAR接口通信实例,从环境准备到SWC端口定义、BSW模块配置,再到通信验证的全过程。通过实战案例'车窗控制'功能模块,帮助开发者快速掌握AUTOSAR架构下的接口通信配置技巧,提升汽车电子软件开发效率。

weixin_42557830的博客 451

工厂方法模式

工厂方法模式:Factory Method 在我们的日常开发中,很多地方都可以用上工厂方法模式(事实是基础开发中,大部分人从来都不会去考虑使用)。 工厂方法模式英文定义: Define an interface for creating an object, but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses. 工厂方法模式

threelifeadv的博客 5483

keil4.72添加GD32F10x芯片

1. 下载 GD32F10x_AddOn_V2.0.1.rar,解压缩。 2. 安装 运行GigaDevice.GD32F10x_AddOn.2.0.0.exe 安装位置 再新建工程,发现已经有GD32F10x 3. 增加的文件分析 运行GigaDevice.GD32F10x_AddOn.2.0.0.exe后,在keil文件夹种增加文件如下: ...

TrueLink的博客 2764

Java设计模式—工厂方法模式&抽象工厂模式

(尊重劳动成果,转载请注明出处:https://blog.youkuaiyun.com/qq_25827845/article/details/52503884冷血之心的博客) 目录 工厂方法模式: 通用类图如下: 抽象产品类: 具体产品类 抽象工厂类 具体的工厂类 场景类: 工厂方法模式的优点: 使用场景: 工厂方法模式的扩展: (1)简单工厂模式 (2)多工厂模式 抽象工厂模式...

冷血之心的博客 1万+

ADS2023实战:2.4GHz超外差接收机从设计到链路预算全流程解析

本文以ADS 2023软件为平台,详细解析了2.4GHz超外差接收机从核心指标定义、架构原理到完整链路搭建与仿真的全流程。通过实战演练,重点阐述了如何利用ADS进行谐波平衡仿真和链路预算分析,以量化评估系统增益、噪声系数等关键性能,为射频工程师提供了一套从理论到仿真的系统级设计方法。

herb5的博客 822

FreeRTOS移植实战:从零开始在STM32上搭建多任务系统(含Proteus仿真配置)

本文详细介绍了如何在STM32平台上从零开始移植FreeRTOS,并搭建多任务系统,包含Proteus仿真配置。通过环境准备、源码移植、多任务设计到仿真调试的全流程实战,帮助开发者快速掌握FreeRTOS在STM32上的应用技巧,提升嵌入式开发效率。

weixin_33737134的博客 232

设计模式-------------工厂模式之工厂方法模式(创建型)

文章目录1、工厂方法模式定义2、应用场景3、UML类图4、结果5、实际例子6、工厂方法模式的优缺点 1、工厂方法模式定义 叫做多态性工厂方法模式,定义一个创建对象的接口,由实现这个接口的类来决定实例化哪个类。把类的实例化推迟到子类中进行。(比如说,鞋子工厂专门造鞋子,帽子工厂专门造帽子,如果要造裤子、就新建一个制造裤子的工厂来专门制造裤子。简单工厂是一个工厂即造鞋子又造帽子。很容易导致臃肿) 2、应用场景 创建对象需要大量重复的代码 客户端不管具体产品怎样创建、实现等细节 一个类通过子类来指定创建哪个对象

日常笔记 | 干货分享 | 毕设源码 | 毕设指导 | 答辩指导 939

55、宇宙微波背景辐射望远镜及其光学系统解析

本文详细解析了宇宙微波背景辐射(CMB)望远镜及其光学系统的设计与优化。内容涵盖折射与反射光学系统的特性、旁瓣控制技术、气球与地面观测系统的对比、探测器阵列的发展、光学系统设计流程以及不同观测场景下的光学系统选择。同时,文章展望了CMB望远镜光学系统的未来发展趋势,包括技术创新、多频段观测、国际合作与大型项目等。通过系统性的分析与对比,为CMB研究提供了全面的技术支持与理论基础。

f9g0h的博客 145

【专题系列】搞定设计模式—— 八 :工厂方法模式

点击上方“java大数据修炼之道”,选择“设为星标”优质文章, 第一时间送达来源 |https://www.cnblogs.com/three-fighter/p/12495242.h...

hello world! 401

Kafka 性能优化与常见问题排查

Kafka 的高性能依赖于合理的集群设计、参数优化与高效的监控体系。生产环境中,应重点关注I/O 瓶颈、分区规划、Producer/Consumer 参数调优,并通过监控与排查手段快速定位问题,从而保障 Kafka 在实时场景下的稳定运行。

X2829352498的博客 235

基于STM32F1XX 、HAL库的BH1745NUC-E2环境光传感器驱动应用C语言程序设计

printf("BH1745制造商ID: 0x%02X\r\n", BH1745_ReadManufacturerID(&hbh1745));#define BH1745_ADDR_HIGH 0x39 // ADDR引脚接VDD。#define BH1745_ADDR_LOW 0x38 // ADDR引脚接地。= 0xE0) // BH1745制造商ID为0xE0。// 清除RGBC测量使能位。printf("BH1745初始化失败\r\n");

PP_Cottage的博客 281

大话设计模式八:工厂方法模式(factory method)

工厂方法模式是简单工厂模式的抽象和扩展。 工厂方法模式是由客户端来决定实例化那一个工厂实现类。 在简单工厂类中如果要增加功能改动的是工厂类,但在工厂方法模式中要改的就是客户端了,由客户端决定 package Factory; public class MainClass { /** * @param args */ public static void main(String

技术人生 1140

【5】GD32H7xx CAN发送及FIFO接收

GD32H7xx CAN收发调试记录,包含源码

madao1234的博客 1818

大话设计模式八:工厂方法模式(雷锋依然在人间)

工厂方法模式是简单工厂模式的抽象和扩展。 工厂方法模式是由客户端来决定实例化那一个工厂实现类。 在简单工厂类中如果要增加功能改动的是工厂类,但在工厂方法模式中要改的就是客户端了,由客户端决定 package Factory; public class MainClass { /** * @param args */ public static void main(Strin...

凤凰涅槃 273

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Java 设计模式】创建型之工厂方法模式

工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但是将对象的实例化延迟到子类中。这样,在实际使用时,客户端代码不需要关心具体实例是哪个类,只需通过工厂方法获取对象即可。工厂方法模式通过解耦了客户端和具体类的关系,使系统更加灵活。工厂方法模式是一种常见且实用的设计模式,它通过定义一个工厂方法接口,将对象的实例化延迟到子类中,从而实现了客户端和具体类的解耦。在实际开发中,工厂方法模式常用于创建复杂对象、管理对象的生命周期等场景。通过灵活使用工厂方法模式,可以使系统更容易扩展和维护。

好久不见的流星 2459

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

『设计模式』工厂方法模式

工厂方法(Factory Method)模式 工厂方法模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 在工厂方法模式中,==核心的工厂类不再负责所有产品的创建,二十将具体创建工作交给子类去做。==这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使- 得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。 在Factory Method模式中,工厂类与产品类往往具有平行的等级结构,他们之间一一对应。 工厂方法模式是简单工

日拱一卒,功不唐捐 3312

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

设计模式——工厂方法模式

工厂方法模式是一种创建型设计模式,通过定义创建对象的接口,让子类决定实例化哪个类。它解决了传统new创建方式导致的耦合问题,使对象创建逻辑集中管理,易于扩展。模式包含抽象产品、具体产品、抽象工厂和具体工厂四个角色。示例展示了日志记录器的实现:定义Logger接口和多种具体记录器(Console/File/Database),通过对应的工厂类创建实例。客户端只需与抽象工厂交互,无需关心具体实现类,实现了解耦和灵活扩展。

蔡定努 1520

【设计模式】工厂方法模式

这就是工厂方法模式呀!

就很有趣的博客 1537

Java 设计模式-工厂方法模式

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“顶级类”。这样便分担了对象创建的压力;避免工厂类中用逻辑判断来决定创建对象,而且这样使得结构变得相当灵活当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的规则来生成,那么就可以被客户使用,而不必去修改任何已有的代码,可以看出工厂方法模式符合开闭原则。

精神小牛马 1251

设计模式——工厂方法模式详解

0.前言实际上工厂模式分为三种,第一种是简单工厂模式,第二种是工厂方法模式,第三种是抽象工厂模式。此篇为工厂方法模式的详解,那为什么跳过了简单工厂模式呢,是因为这两种模式差别不大,差异之处会在本文中指出,懂了工厂方法模式,稍微解释就懂了简单工厂模式。所以仔细看哦~还有就是抽象工厂模式,这个模式以后会另外写文章介绍。1.工厂方法模式模式介绍工厂方法模式定义……...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 1万+

设计模式实践教程 - 基于 micooz/DesignPattern 开源项目

设计模式实践教程 - 基于 micooz/DesignPattern 开源项目 项目介绍 该项目由 Github 用户 micooz 维护,是针对软件开发中常见设计模式的实现集合。它旨在提供一个学习和理解各种设计模式的实战平台,涵盖了从单例模式到观察者模式等二十多种经典设计模式。通过此仓库,开发者可以深入学习每种模式的概念、应用场景及其实现细节,助力提升代码质量和可维护性。 项目快速启动 环境要求...

gitblog_00751的博客 819

【设计模式】工厂方法模式 在java中的应用

【设计模式】工厂方法模式 在java中的应用

qq_42320804的博客 1397

Java 设计模式之工厂方法模式

工厂方法模式,作为应用相当广泛的设计模式,是我们必须要掌握的,本文是在上一讲 “静态工厂方法模式” 的基础上继续讨论起来的,通过代码示例+Java源码介绍的方式,帮助大家理解这种设计模式。

牛角尖 918

设计模式之工厂方法模式

定义 工厂方法模式,定义抽象工厂类来负责定义创建对象的公共接口,而具体工厂类则负责生成具体的对象。 类型 创建型。 角色: 抽象产品:它是定义产品的接口,产品对象的公共父类 具体产品:它实现了抽象产品接口,具体工厂和具体产品之间一一对应,具体产品由专门的具体工厂创建。 抽象工厂:用于返回一个产品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。 具体工厂:它是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并可由客户端调用,返回一个具体产品类的实例。 与简单工厂模式相比,工厂方法模式最

小灰狼与大白兔的博客 6044

设计模式Python版 工厂方法模式

介绍了GOF设计模式中的工厂方法模式,以及工厂方法模式的Python实现示例。

分享、交流、合作 1467

每天一个设计模式 —— 工厂方法模式

工厂方法模式是一种创建型设计模式,通过将对象实例化推迟到子类来实现扩展性。该模式包含4个核心角色:抽象产品定义接口,具体产品实现不同变体,抽象工厂声明创建方法,具体工厂实现特定产品的创建。以披萨店为例,父类PizzaStore定义订单流程,子类NYPizzaStore和ChicagoPizzaStore各自实现createPizza()方法创建对应风味的披萨。相比简单工厂模式,工厂方法的优势在于新增产品时只需扩展新类而无需修改现有代码,完美遵循开闭原则。这种"父类定规则,子类做实现"的方

sengminPark的博客 1250
上一篇: 设计模式—— 七 :单例模式
下一篇: 设计模式—— 九 :抽象工厂模式
加班不秃顶
博客等级 码龄7年 1822粉丝 599原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值