java静态工厂方法模式_设计模式:简单工厂模式(静态工厂方法模式)

简单工厂的构成包括三个角色:

1)抽象产品类

2)具体产品类(继承抽闲产品类)

3)工厂类(生产具体产品)

具体代码实现

c6c138858840fd2cd290fbbf6b816596.png

1、抽象产品类

/**

* 抽象类

*/

public abstract class Car {

/**

* 产品抽象方法,将会由具体产品类实现

*/

public abstract void driving();

}

2、具体产品类

/**

* 具体产品类BenZCar

*/

public class BenZCar extends Car {

@Override

public void driving() {

System.out.println("BenZCar is Driving!!!");

}

}

/**

* 具体产品类BMWCar

*/

public class BMWCar extends Car {

@Override

public void driving() {

System.out.println("BMWCar is Driving!!!");

}

}

3、工厂类

/**

* 简单工厂类

*/

public class CarFactory {

public static Car create(String type) {

Car car = null;

switch (type) {

case "bmw":

car = new BMWCar();

break;

case "benz":

car = new BenZCar();

break;

}

return car;

}

}

4、调用(这里使用AndroidStudio代码测试,如果是java的可以在main函数中测试)

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.id_bmw).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

CarFactory.create("bmw").driving();

}

});

findViewById(R.id.id_benz).setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

CarFactory.create("benz").driving();

}

});

}

}

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/id_bmw"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="制造一个BWM汽车"

android:layout_marginBottom="15dp"/>

android:id="@+id/id_benz"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="制造一个Benz汽车"

android:layout_marginBottom="15dp"/>

5、界面

4bc89a982c684db20c3c093a55e9303c.png

6、测试结果

08-20 10:59:55.001 3660-3660/com.tech.aile.designpatterns I/System.out: BMWCar is Driving!!!

08-20 10:59:56.573 3660-3660/com.tech.aile.designpatterns I/System.out: BenZCar is Driving!!!

7、使用场景

1)工厂类创建的具体对象要较少,不适用子类过多,子类层级过深的场景。

2)看客户只需要传入什么类型的参数,不用关注创建对象的逻辑。

8、优点

根据参数类型获取实例,不用关注具体细节,降低了耦合

9、缺点

具体的产品类型在编译期间已经确定,不能更改,如果需要新增具体产品就需要修改工厂类,添加新具体产品类,违背了封闭开放原则;

简单工厂必须知道所有需要生产具体产品类,不适用子类过多,子类层级过深的场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kibana中的Coordinate Map地图报索引错误的问题

今天做地图定位展示,展示的是ApacheWeb服务器的访问日志文件中的来源IP。但是中间出现了报错环节,说是索引不能匹配到geo_point类型,实在是不懂这是在说什么,后来在网站找了方法就解决了。主要报错如下: 报错信息&…

mysql数据库安装在unix_Linux下的数据库二:在Linux/Unix平台安装MySQL

推荐使用RPM工具来进行Linux下的MySQL数据库安装。目前的MySQLrpm安装文件包是在SuSE Linux7.3系统平台上打造而成的,但是在绝大多数支持RPM和glibc的其他Linux平台中也可以进行安装。如果选择通用的RPM安装包,那么RPM将静态链接到Linux的线程中。下面步…

mysql时区设置gmt_将MySQL数据库时区设置为GMT

不,不可能在MySQL实例中更改单个数据库的时区.您可以检索服务器和客户端time_zone设置:SELECT global.time_zone, session.time_zone;您还可以更改整个MySQL实例的客户端时区或时区.但要敏锐地了解现有客户端连接的含义,以及如何解释已存储在实例中的DATETIME和TIME…

javaSE知识点汇总

javaSE知识点汇总Java基础知识精华部分写代码:1,明确需求。我要做什么?2,分析思路。我要怎么做?1,2,3。3,确定步骤。每一个思路部分用到哪些语句,方法,和对象。4,代码实现…

java中412是什么错_HTTP 412 错误 – 先决条件失败 (Precondition failed)

HTTP 412 错误 – 先决条件失败 (Precondition failed)介绍您的 Web 服务器认为,该服务器检测到客户端发送的 HTTP 数据流包括一个没有满足的‘先决条件’规范。HTTP 循环中的 412 错误任何客户端 ( 例如您的浏览器或我们的 CheckUpDown 机器人 ) ,都需要…

细谈页面回流与重绘

你将了解到: 什么是回流 什么是重绘 回流何时发生 重绘何时发生 如何避免回流和重绘 复制代码带着上面的问题,我们一探究竟 什么是回流 回流:英文是reflow 当render tree中的一部分(或全部),因为元素的规模尺寸、布局、隐藏等改变…

安卓 java中改布局_android-选项卡布局中的地图视图throwing,java....

我创建了一个具有选项卡布局的应用程序,单击选项卡后,我将打开一个使用Web视图的新活动.另外另一个选项卡使用地图视图,列表视图,图像视图.现在,我在Samsung Galaxy Y上安装了我的应用程序-运行正常.当我在Samsung Galaxy Tab 2上安装相同的应用程序时,当我第一次打开地图视图,…

怎么样修改PuTTY的默认字体和字符集

1.在窗口标题上点击右键,选择 Change Settings...2.在打开的配置窗口左边选择 Appearance,在右边点 Font settings 里面的 Change 按钮,选择好中文字体,比如:宋体、新宋体之类的3.选择配置窗口左边的 Translation&…

python 元组比较大小_为什么元组比列表更快?

所报道的“build设速度”比率只适用于常量元组(项目用文字表示)。 仔细观察(并在机器上重复 – 只需在shell /命令窗口input命令!)…:$ python3.1 -mtimeit -sx,y,z1,2,3 [x,y,z] 1000000 loops, best of 3: 0.379 usec per loop $ python3.1 -mtimeit […

windows软链接的建立及删除

2019独角兽企业重金招聘Python工程师标准>>> 1.建立举例 # 建立d:develop链接目录,指向远程的目标服务器上的e盘的对应目录。 mklink /d d:\develop \\138.20.1.141\e$\develop# 建立d:develop链接目录,指向远程的目标服务器上的e盘的对应目录…

php原生类,反序列化之PHP原生类的利用

正文文章围绕着一个问题,如果在代码审计中有反序列化点,但是在原本的代码中找不到pop链该如何?N1CTF有一个无pop链的反序列化的题目,其中就是找到php内置类来进行反序列化。基础知识首先还是来回顾一下序列化中的魔术方法,下面也…

Spectral Bounds for Sparse PCA: Exact and Greedy Algorithms[贪婪算法选特征]

目录 概括Sparse PCA Formulation非常普遍的问题Optimality ConditionsEigenvalue Bounds算法代码概括 这篇论文,不像以往的那些论文,构造优化问题,然后再求解这个问题(一般都是凸化)。而是,直接选择某些特…

js php调用webservice,php调用web services两种方法soap和curl

以http://www.webxml.com.cn/zh_cn/index.aspx一、使用soap调用//服务器支持soap扩展:/*Example 1:$client new SoapClient("http://fy.webxml.com.cn/webservices/EnglishChinese.asmx?wsdl");$parameters array("wordKey">"test");//中英…

JS基础-3

1.for in 对象中有多少组键值对,我们的FOR IN 循环就遍历多少次(不一定) 每一次循环KEY这个变量存储的都是当前循环这组键对值的属性名 1、KEY存储的值都是字符串格式的(不管属性名是否为数字) 2、在FOR IN 循环遍历的时候,大部分浏览器都是先把对象中的键值对进行排…

Python常用的几个函数

print()函数:用于打印输出信息到控制台。 input()函数:用于从控制台获取用户输入。 len()函数:用于获取字符串、列表、元组、字典等对象的长度。 range()函数:用于生成一个整数序列,常用于循环中。 type()函数&…

数据结构——常见的定义

问题答案Ο标记法(大Ο标记法)是一种用于衡量算法时间复杂度的表示方法。它描述了算法在最坏情况下的运行时间增长率。当我们使用Ο标记法时,我们关注的是算法的上界,即算法的运行时间不会超过Ο(f(n)),其中 f(n) 是输…

TikTok与环保:短视频如何引领可持续生活方式?

在数字时代,社交媒体平台扮演着塑造文化和价值观的关键角色。而TikTok,作为一款全球短视频平台,不仅塑造着用户的娱乐方式,还在悄然地引领着可持续生活方式的潮流。本文将深入探讨TikTok与环保之间的关系,分析短视频如…

Spring源码分析---Bean 的生命周期 03

来源:Spring 3. Bean 的生命周期 自定义一个 SpringBoot 的主启动类: SpringBootApplication public class A03Application {public static void main(String[] args) {ConfigurableApplicationContext context SpringApplication.run(A03Applicatio…

go-carbon v2.3.0 圣诞特别版发布,轻量级、语义化、对开发者友好的 Golang 时间处理库

go-carbon v2.3.0 圣诞节特别版发布,这应该是 2023 年的最后一个版本,祝大家圣诞节快乐! carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用。 目前已被 awesome-go 收录,如果您觉得不错…

pytorch 实现 Restormer 主要模块(多头通道自注意力机制和门控制结构)

前面的博文读论文:Restormer: Efficient Transformer for High-Resolution Image Restoration 介绍了 Restormer 网络结构的网络技术特点,本文用 pytorch 实现其中的主要网络结构模块。 1. MDTA(Multi-Dconv Head Transposed Attention:多头…