当前位置: 首页 > 编程日记 > 正文

创建对象_工厂方法(Factory Method)模式 与 静态工厂方法

工厂方法模式:

定义:为创建对象定义一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟至子类。
应用场景
  • 客户类不关心使用哪个具体类,只关心该接口所提供的功能;
  • 创建过程比较复杂,例如需要初始化其他关联的资源类,读取配置文件等;
  • 接口有很多具体实现或者抽象有很多具体子类时,你可能需要为客户代码写一大串 if-else 逻辑来决定运行时使用哪个具体实现或者具体子类;
  • 不希望给客户程序暴露过多此类的内部结构,隐藏这些细节可以降低耦合度;
  • 优化性能,比如缓存大对象或者初始化比较耗时的对象。
工厂方法模式
//工厂接口定义了 createProduct()方法来放回 Product 类型的实例对象
public interface Factory {// 如果具体实现较多,定义一个参数化的工厂方法,根据不同的参数返回不同的子类
    Product createProduct(String type);
}//工厂接口实现类
public class ConcreteFactory implements Factory {// 如果具体实现较多,定义一个参数化的工厂方法,根据不同的参数返回不同的子类
    @Overridepublic Product createProduct(String type) {if ("type1".equals(type)) {return new ConcreteProduct1();} else if ("type2".equals(type)) {return new ConcreteProduct2();} else {return new ConcreteProduct3();}}
}//定义产品统一接口
public interface Product {}
//不同的产品实现
public class ConcreteProduct1 implements Product {}
public class ConcreteProduct2 implements Product {}
public class ConcreteProduct3 implements Product {}
客户类通过工厂得到产品实例:
public class Client {private Factory factory;public Client(Factory factory) {this.factory = factory;}public void dosomething(String type) {Product product = factory.createProduct(type);// to do something
    }public static void main(String[] args) {// 实例化工厂Client client = new Client(new ConcreteFactory());// 传入参数给工厂得到指定的产品实例client.dosomething("type1");}
}

静态工厂方法:

应用场景:工厂模式为每个类创建一个工厂方法 方法类会引起工厂类的泛滥。
解决方案:使用静态工厂方法来避免——在每个类里实现一个静态的工厂方法,就不再需要额外的工厂类。
静态工厂方法的优缺点
  • 优点:
    • 可以为静态工厂选择合适的命名,提高程序的可读性。
    • 静态工厂和工厂模式一样,可以封装复杂的初始化过程,实现实例的缓存。
    • 还可以根据不同的输入返回不同实现类/具体类对象。
  • 缺点:
    • 一般为了强迫使用工厂方法,不直接使用构造方法来构造实例,我们会强迫类只含有私有或是default的构造方法,这样,会导致此类不能被子类化。
    • 如果添加了一个新的该类的子类(该类有非私有的构造方法),此静态工厂方法可能需要重写,以加入该子类的实例化过程,导致扩展性不强。
    • 静态方法没有面向对象的特征,比如继承、动态多态等,不可被覆写(Overwritten)。
    • 采用构造函数实例化对象,是语言的规范,而静态工厂方法与其他的静态方法没有区别,就增加了用户使用的区别。但这可以尽量采用一些家喻户晓的名字解决,让用户看到改名字就知道该方法是静态工厂方法。如getInstance( )。
    • 静态工厂方法代表了一种对规范的背离。
创建类的实例最常见的是new 除此外还可以使用静态工厂方法,来封装实例的细节,并且能控制实例的数量,减轻 jvm的堆栈中的压力。
静态工厂方法与用 new语句调用的构造方法相比,有以下区别:
  • 使程序具有更好的可读性。静态工厂方法可以突破构造函数不能自由命名的限制,对于不同的工厂方法可以采用不同的会意的名字。JAVA平台库的java.text.Format的子类NumberFormat就有getInstance() , getPrecentInstance() , getCurrencyInstatnce()等静态方法,通过不同的名字产生特定的对象。
  • 加大了程序设计和使用的灵活行。静态工厂方法是用来产生对象用的,至于产生什么类型的对象没有限制,这就意味这只要返回原返回类型或原返回类型的子类型都可以;或者是否会创建一个新的对象完全取决于方法的实现。如java.util集合框架就采用了这种优势,这样就可以更好达到封装的目的,降低API的数目和用户的使用难度,java.util.Connections是集合框架的辅助类用于对原有的集合类进行进一步封装,产生一些同步的集合,不可修改的视图。都是采用静态工厂方法实现的,至于方法内部的实现类就完全别封装了。也迫使我们使用接口编程。
  • 解耦。静态工厂方法所创建的对象可以在编译时不存在,动态创建对象,采用反射,类似Spring 的 IOC容器方转。达到对象的创建与使用分离,使对象的客户和对象之间解耦,增加程序的灵活性和可扩展性。
静态工厂方法最主要的特点是:每次被调用的时候,不一定要创建一个新的对象。利用这一特点,静态工厂方法可用来创建以下类的实例。
  • 单例类:只有惟一的实例的类。
  • 枚举类:实例的数量有限的类。
  • 具有实例缓存的类:能把已经创建的实例暂且存放在缓存中的类。
  • 具有实例缓存的不可变类:不可变类的实例一旦创建,其属性值就不会被改变。
所谓静态工厂方法(static factory method),实际上只是一个简单的静态方法,它返回的是类的一个实例。
public   static  Boolean  getTrue () {return  Boolean.TRUE;
}

总结:工厂模式把对象实例化的过程进行了封装,客户对象不必为实例化而考虑更多,分离了实例化的逻辑,使得对象间的耦合性大大降低。

转载于:https://www.cnblogs.com/lindu/p/3186400.html

相关文章:

数据通信技术(一:IP划分)

一、某公司生产部有50人,销售部有100人,财务部有25人,客服部有12人,没个员工配置一台主机,该公司有192.168.100.1/24的网段可用,应该如何划分子网。 销售部(100)台:/25 …

团队作业—第二阶段06

站立会议: 继续数据库的连接编程。 任务进度: 实现数据的输出。 站立会议照片: 任务看板: 燃尽图: 转载于:https://www.cnblogs.com/cpljlgs/p/5546157.html

Fade 数字切换动效

原文链接:http://www.jianshu.com/p/983674e6f4ef根据原型高度还原的一个动效作品。希望可以通过审核。谢谢。 —— 由Bear1494735376123分享欢迎同样喜爱动效的你加入 iOS动效特攻队–>QQ群:547897182 iOS动效特攻队–>熊熊:64807025…

fieldset 使用小案例

有初学者问到如何做出如下页面: 对应的代码如下: <fieldset><legend>★审核状态</legend><input name"state" type"radio" class"input1" value"1" />已审核<input name"state" type"radio…

数据通信技术(二:交换机配置管理)

交换机配置与管理&#xff08;思科模拟器&#xff09; 1.从用户模式进入特权模式,并进入配置模式设置进入特权模式的密码; 2.进入交换机的端口模式并进行端口状态的设置; 用新密码登录并查看接口状态信息,重启交换机;4.硬件和软件版本查询: 5.设备CPU的利用率: 6.检查设备的MA…

iOS之各种区别

作者 APP叫我取个帅气的昵称 关注 2017.05.15 10:47* 字数 140 阅读 1273评论 7喜欢 51写在前面&#xff1a;本文持续更新&#xff0c;也欢迎简友提供更多的关于iOS&#xff08;包括swift&#xff09;中的区别 1. _ _block和 _ _weak修饰符的区别的&#xff1a; (1). _ _block不…

lightoj 1014

lightoj 1014 Ifter Party 链接&#xff1a;http://www.lightoj.com/volume_showproblem.php?problem1014 题意&#xff1a;给你两个数 p, l&#xff0c;求 cha&#xff08;cha p-l&#xff09;的约数&#xff0c;当约数大于 l 时&#xff0c;按从小到大输出 思路&#xff1a…

poj 2681 字符串

http://poj.org/problem?id2681 给你任意长度的字符串&#xff0c;找出两串字符中不相同的字符个数&#xff08;总数&#xff09; #include<string> #include<cstring> #include<iostream> #include<cstdio> using namespace std; int main() {int n;…

数据通信技术(三:VLAN划分)

VLAN划分 1.配置环境 &#xff1a;创建4台PC机&#xff0c;并为PC机配置IP PC0&#xff1a;192.168.1.1/24 PC1&#xff1a;192.168.1.2/24 PC2&#xff1a;192.168.1.3/24 PC3&#xff1a;192.168.1.4/24 2.修改交换机名称&#xff1a; 创建VLAN1和VLAN2&#xff1a;…

CSS(2 )-- CSS样式大全

常用css样式大全Author&#xff1a;xu_shuyi201504039.CSS颜色代码大全http://www.cnblogs.com/axing/archive/2011/04/09/CSS.html1.CSS文字属性color : #999999; /*文字颜色*/font-family : 宋体,sans-serif; /*文字字体*/font-size : 9pt; /*文字大小*/font-style:itelic; /…

java io读书笔记(6) Writing Arrays of Bytes

显而易见&#xff0c;一次性写出一堆数据&#xff0c;要比一个byte一个byte的写&#xff0c;快多了&#xff0c;因此&#xff0c;outputstream&#xff0c;给出了2个增强型的write&#xff1a; public void write(byte[] data) throws IOException public void write(byte[] da…

iOS 自定义双向滑块Slider

ZPSlider 一个双向滑块的Slider 前提 这个是在一次和朋友吃饭的时候&#xff0c;我们唠嗑的时候他说的一个需求。因为系统的Slider是只有一个滑块的&#xff0c;而且没有分段滑动的效果。 这不最近都在研究这么个需求。 How to use it -(instancetype)initWithFrame:(CGRec…

数据通信技术(四:链路聚合)

1、修改交换机名称 2、配置A交换机数据 3、配置B交换机数据 4、创建VLAN 5、互拼验证 6、去掉一条链路再进行验证 数据通信技术&#xff08;一&#xff1a;IP划分&#xff09; https://blog.csdn.net/qq_37823605/article/details/90345408 数据通信技术&#xff08;二&#xf…

iOS图片,视频上传视频内容旋转

#前言 我最近在接手一个智能盒子的iOS应用&#xff0c;上面有一个功能是这样的。把你本地的照片和视频可以甩屏到你绑定的盒子上。 我的上一位前辈做的时候必须要求再同一个局域网&#xff0c;但是当我做的时候要求不同的局域网也要实现这样的一个功能&#xff0c;优化用户的使…

jackson 解析json问题

1、json串中有key为A&#xff0c;但指定转换的mybean中未定义属性A&#xff0c;会抛异常。处理&#xff1a;mapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)&#xff0c;加上这一条&#xff0c;就没问题了&#xff0c;正常转换。 2、 默认的json串&#xff0c;如…

【转】UIColor对颜色的自定义

原文网址&#xff1a;http://blog.sina.com.cn/s/blog_5f19ccb10101bhqh.html 在iOS开发中&#xff0c;我们使用UIColor来对我们的界面进行颜色设置&#xff0c;一般我们通过以下两种方法使用UIColor&#xff1a;1,label.textColor [UIColor blueColor];2,label.textColor [U…

数据通信技术(八:OSPF单区域配置实验)

OSPF单区域配置实验(Cisco) 一&#xff0e;知识准备 1.掌握了OSPF动态路由协议的定义和功能&#xff1b; 2.掌握了OSPF动态路由协议的特征和工作原理。 二&#xff0e;实验目的 掌握OSPF动态路由单区域的基本配置方法和结果验证。 掌握OSPF单区域配置的作用 三&#xff…

redis在php中的使用介绍

redis介绍 redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs&#xff08;哈希类型&#xff09;。这些数据类型都 支持push/pop、add/remo…

控制发光二极管

一 LED驱动的实现原理 尽管Linux驱动直接与硬件打交道&#xff0c;但并不是Linux驱动直接向硬件中的内存写数据&#xff0c;而是与本机的I/O内存进行交互。每一个连接Linux的硬件在I/O内存中都会有映射首地址&#xff0c;开发板上的LED也有其映射首地址。 二 编写LED驱动 第一…

iOS 跑马灯之 TXScrollLabelView

前言 前段时间在开发一个广播的功能&#xff0c;网上也自己找了一些库&#xff0c;没有发现非常好用的&#xff0c;于是自己抽时间写了一个&#xff0c;在 Github 上发布一天收获六十多个 star&#xff0c;这里首先感谢大家在微博上的转发&#xff0c;使得 TXScrollLabelView 被…

数据通信技术(六:静态路由实验)

数据通信静态路由实验 1、R1路由的端口配置 2、R2路由的端口配置 3、R3路由器端口配置 4、互通性验证 5、拓扑结构 数据通信技术&#xff08;一&#xff1a;IP划分&#xff09; https://blog.csdn.net/qq_37823605/article/details/90345408 数据通信技术&#xff08;二&#…

172. Factorial Trailing Zeroes

/**172. Factorial Trailing Zeroes *2016-6-4 by Mingyang* 首先别忘了什么是factorial&#xff0c;就是阶乘。那么很容易想到需要统计* (2,5)对的个数&#xff0c;因为2510。但是这个条件放松一下就会发现其实只要数5的个数就好了&#xff0c;* 因为2实在是比5要多的多。那么…

MarkdownView:Markdown 文档预览视图组件

原文链接&#xff1a;https://github.com/keitaoouchi/MarkdownViewMarkdownView&#xff1a;Markdown 文档预览视图组件。# 为开源点赞# —— 由SwiftLanguage分享MarkdownView is a WKWebView based UI element, and internally use bootstrap, highlight.js, markdown-it. H…

项目管理过程中,如何编制初步工作说明书

最近在做一个项目的时候&#xff0c;客户特别苛刻&#xff0c;在制定工作说明书的时候&#xff0c;费了很多周折&#xff0c;把很多以前做项目的时候都不怎么会专门考虑的细枝末节和例外情况都进行了详细说明和约定&#xff0c;但是在项目实施过程中&#xff0c;却发现这样的说…

数据通信技术(七:RIP路由水平分割配置)

RIP路由水平分割配置实验报告 一、知识准备 掌握RIP动态路由的定义和特征。掌握RIP路由环路的危害和解决技术。掌握水平分割的工作原理。二、实验目的 掌握路由器中RIP动态路由水平分割功能的配置方法和结果验证&#xff0c;并通过实验结果更好的理解水平分割的作用和原理。…

android蓝牙4.0(BLE)开发之ibeacon初步

一个april beacon里携带的信息如下 ?1<code class" hljs ">0201061AFF4C0002159069BDB88C11416BAC3F33468C2788A3044B0378C60C09417072696C426561636F6E051250002003020A0000000000000000000000</code>具体是什么意思呢 ?1234567891011121314151617181…

APP程序内部打开某个APP的AppStore页面

作者 呀咪9527 关注 2017.03.21 16:44* 字数 222 阅读 154评论 0喜欢 9最近在做内购用到了StoreKit.framework库&#xff0c;偶然间发现中SKStoreProductViewController这个类&#xff0c;查看文档后发现一个妙用&#xff0c;解决了我一个痛点&#xff1a;APP每次更新或者跳转至…

sql server 2014预览版发布

MSDN发布sql server2014预览版&#xff0c;如下图&#xff1a; SQL Server 2014新特性&#xff1a; 微软SQL Server部门主管Eron Kelly介绍&#xff0c;通过将交易处理放到内存中进行&#xff0c;新的SQL Server 2014在测试中能够将性能提升50倍以上。在新版本中&#xff0c;DB…

数据通信技术(九:OSPF特殊区域配置(Cisco))

OSPF单区域配置实验(Cisco) 一&#xff0e;知识准备 1、掌握了OSPF动态路由协议的定义和功能&#xff1b; 2、掌握了OSPF动态路由协议的特征和工作原理。 二&#xff0e;实验目的 1、掌握路由器中OSPF特殊区域STUB配置方法和功能验证&#xff1b; 2、掌握OSPF特殊区域STUB…

iOS 屏幕亮度和闪光灯控制

所用涉及框架&#xff1a;AVFoundation框架和ImageIO 读取屏幕亮度&#xff1a;[UIScreen mainScreen].brightness; 设置屏幕亮度&#xff1a;[[UIScreen mainScreen] setBrightness:0.5]; 获取环境亮度主要代码&#xff1a; - (void)getTorch {AVCaptureDevice *device [AV…