设计模式工厂模式(Swift设计模式----工厂方法模式)

本文目录
Swift设计模式----工厂方法模式
工厂方法是一种创建型设计模式,其在父类中提供一个创建对象的接口,允许子类决定实例化对象的类型。
现在我们来定一个抽象产品类:
一个动物抽象类,里边有个type属性表示种类,一个say方法会发出声音。
然后我们搞两个具体的动物:
一猫一狗两个具体动物类,分别实现say方法。
现在我们来创建工厂超类:
这个类目前只有一个功能,创建并返回一个动物。
我们来分别实现两个具体工厂:
这两个工厂,分别创建猫和狗。客户端调用时可以这样:
打印结果是:
这样利用工厂方法看起来跟直接使用猫类和狗类来创建对象好像没什么区别,但是却有质的改变:
1.工厂方法封装了创建对象的过程,简化客户端的创建流程,隔离了创建者和具体对象的紧密联系。
2.工厂方法里还可以实现对象池,管理对象的复用逻辑。
3.符合开闭原则,添加新的产品只需要添加一个产品类和一个工厂类。
4.符合单一职责原则,每个工厂类就负责一个产品。
程序开发中的工厂模式是什么呢
你好,很高兴能解答你的问题,工厂模式是程序中的一种常见的设计模式。
首先工厂模式是软件开发中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂模式主要的意图是:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
案列1:您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
案例2:日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
1、开闭原则
开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则
里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
希望能帮到你,谢谢!
常见几种设计模式之工厂模式
(1)简单工厂模式(静态工厂模式)
(2)工厂方法模式
(3)抽象工厂模式
(4)总结
(5)JDK源码Calendar
安卓设计模式(八)工厂方法模式
工厂方法模式是创建性设计模式之一,一般用于复杂对象的创建
该系列其他文章:
下面以Androd经常用到的缓存Cache来举例说明:
缓存接口,定义所有缓存必须实现的方法
工厂方法根据需求又用几种不同的实现,不过思想是一致的,下面分别说明
1. 简单工厂(静态工厂)
如果我们程序中整体只需要一种缓存即可,不需要多种缓存,如磁盘缓存,所以只需要单一缓存子类及单一工厂即可:
2. 工厂与产品一对一,即每个工厂负责生产一种产品
3. 工厂与产品一对多,即每个工厂可以生产多种产品
工厂接口,定义所有工厂的必须实现的方法:
具体工厂,可根据需求生产不同的产品:
使用:
由以上可以的举例可以看到使用工厂方法创建对象简单明了,如果上面的缓存对象创建时需要设置很多参数,初始化数据等等,那么使用工厂方法模式相对于直接new一个实例有很大优势.工厂方法模式将对象的创建过程封装在工厂中,使得客户端无需再关心实例的创建和初始化过程.
实际开发中第三种使用的比较多,根据需求创建不同实例.
设计模式(三)创建型模式
根据菜鸟教程的目录,我们首先来看看创建型模式。 创建型模式研究:
下面分别对创建型模式下的各种具体模式进行讲解。
先看例子: 工厂模式。
某功能的使用者只和接口打交道,不关心如何实现。这种情况下,肯定有一个接口类,使用者使用接口;功能提供者继承并实现接口。这利用了C++的多态特性。
既然使用者只关心接口,那么没有必要把子类直接给使用者,没有必要让使用者在代码中直接new子类。如果这样做,会把不必要的信息暴露给使用者,增加了信息的耦合。试想,如果使用者在很多地方都new了子类,那么如果这些地方需要修改的话,怎么改?只能一个一个地方改,改完还需要编译,维护极其困难。
工厂模式是指,针对某一功能接口,我们要新建一个工厂类,此工厂类将接口子类名称、接口子类的创建过程封装起来,只返回一个接口指针给接口的使用者。接口的实现类对使用者完全透明,高度解耦。这样可以方便地切换接口的具体实现,而不影响上层功能使用者。拿 汽车 打比方,不管工厂生产 汽车 的流程是什么,只要是 汽车 ,它的驾驶方法(人机接口)都类似。
显而易见,工厂模式在使用者和实现者之间增加了一个封装层,这正印证了计算机行业中一句名言:
典型的例子是:Qt中的数据库模块就利用了工厂模式,封装了数据库的底层实现。在保持数据库用户接口不变的情况下,通过更换数据库驱动,可以实现数据库类型无缝切换。
在需求趋于稳定时使用,需求不稳定时,不要过度设计,否则设计很容易被推翻,白费力气。
从设计模式的本质来看,工厂模式:
先看例子: 抽象工厂模式。
由前面工厂模式可知,所有的“工厂”有一个共同点:每个工厂都会提供创建对象的函数。 既然所有工厂都实现了同一类功能,那么我们可以为工厂抽象出一个公共接口(虚基类),此接口定义了创建工厂子类的功能。 这种场景是否似曾相识?是的,工厂和工厂的功能接口构成了使用工厂模式的场景。即工厂本身也适用于工厂模式。 使用工厂模式来设计工厂,必然要写一个生产工厂的工厂。 生产工厂的工厂,返回值是工厂的抽象接口类,所以这种设计模式叫“抽象工厂模式”。其实,笔者觉得把这种设计模式叫做“工厂工厂模式”更容易理解。
如果只有一个工厂就不要使用抽象工厂模式了,只有在工厂很多时,才使用抽象工厂模式。
需求不稳定时,不要过度设计,一切都可能被推翻。 对于小的项目,不需要过度追求使用设计模式,架构的代码最好只占整个项目代码的一小部分,否则就是主次颠倒,给自己找麻烦。 对于大的项目,在需求较稳定的情况下,为了提高可维护性、扩展性,可以考虑使用设计模式。 另外,抽象工厂模式有一定的理解难度,要考虑你设计的代码,其他人是否能够读懂,简单易懂也是需要考虑的方面。
所以,从设计模式的本质来看,
先看例子: 单例模式。
上面的例子都是允许一个类被创建多次的。如果我们想要限制一个类只被创建一次,即只有一个全局可访问的实例(和C语言中的全局变量一样),例如应用程序对象,每个应用程序都应该只有一个应用程序对象。此时应该怎么编写代码呢?
答案还是封装。把不想暴露出来的信息藏起来,把必须暴露的信息暴露出来。单例模式把类的构造函数设置成private私有访问权限,限制外部无法通过new来创建实例。只能通过特定的接口来获取实例指针。需要提及的是,封装时需要考虑多线程安全的问题。
当一个类需要有多个实例存在时,不使用单例模式。
从设计模式的本质上看,
具体的例子和写法,可以参考菜鸟教程中的 建造者模式。
建造者模式的典型使用场景是快餐店的套餐搭配模型。 套餐由若干个单个餐品组合而成。单个餐品又由不同的原材料构成。这种层层组合的树形对象关系的应用场景下,为了创建顶层的对象,需要先一层层的创建底层的对象,逐步向上,直到构造出根对象。 这种场景下,使用继承可以将同类的对象关联起来,使用组合可以将不同类型的对象组合起来。组合就是把不同对象放在一块内存中保存,作为一个整体使用。
完全使用继承来解决此类问题是非常不提倡的。设计模式理论中有一个原则是:“少用继承,多用组合”。因为继承是一种强耦合,组合是一种松散的耦合。耦合不利于适应需求变化,是项目中的一颗定时炸弹。
从设计模式的本质上看,
菜鸟教程中没有提及的一种设计模式是组合模式。具体内容可以参考: 第四节:组合模式和建筑者模式详解。
这里简单说明一下,组合模式和建造者模式比较像,也是遵循树形对象关系结构。和建造者模式相比,不同之处在于,子对象和父对象具有相同的类型。所以可以说,组合模式是简单的建造者模式。
具体的使用场合和实例,见原型模式。
原型模式,在实际使用时可能用得不多。用一句话描述其特点:
这种克隆是一种内存中的复制行为,速度快,能充分利用已有对象的缓存数据,性能高。克隆出来的对象具有和原对象相同的属性和行为,可以用来帮助原对象处理一些事务。用一句动漫中的词汇来描述,“影分身”再合适不过了。
从设计模式的本质看,
下一篇,我们将介绍结构型模式。
工厂设计模式浅析
就像六大原则一样,每一种设计模式也都是一种思想,而不是一种特定的形式,所以要灵活求变。这次简单分析一下工厂设计模式在实际开发当中的应用。工厂设计模式分为三大类: 简单工厂、工厂方法、抽象工厂 。而工厂方法又分为两种形式:单工厂形式和多工厂形式。这次将结合数据存储的三种类型,对工厂模式的各个形式来分析一下。这三种类型分别是内存存储(LRUCache)、SharedPreferece、Disk磁盘存储,它们将作为产品由工厂生产。
下面我们先定义一个产品存取数据的接口,它将作为三种类型的数据存储的规范。
上面定义了 String 、int、boolean三种数据类型存取的抽象方法,这里可以扩展。然后我们分别定义三种数据存储类型的实现类:
上面 MemoryHandler 继承自 ISaveHandler ,实现LruCache 内存缓存。
上面 SharedPreferenceHandler 继承自 ISaveHandler ,实现SharedPreference 缓存。还有磁盘缓存就不写了,有兴趣的可以自己扩展。这里主要讲解一下工厂设计模式。下面开始写简单工厂,简单确实也很简单,一个工厂一个switch语句:
上面就是通过传入的枚举类型生成相应的存储对象。不多说,看一下用法吧:
这种枚举类型的简单工厂模式好处就是清楚明了类型少,没那么多拐弯抹角。不好的地方就是,当数据存储类型(产品类型)需要扩展的时候,需要改动工厂。下面我们来看一下第二种:工厂方法模式。
开头说了,工厂方法模式由两种形式,一种是多工厂形式,一种是单工厂形式。
上面我们看到了一个工厂里面一个方法,就用于生成 SharedPreference形式的存储。如果要生成其他形式的存储,那么就再造一个相应的工厂。别的工厂这里就不贴出来了。其实这种方式更加一目了然,但缺点也很一目了然,就是工厂贼多。那下面就看一下工厂比较少的形式。
上面就是通过类型,然后反射获取存储类型的对象。这种模式和简单工厂有点类似,只不过这里不需要维护枚举类。当需要扩展数据存储方式时,只需要增加数据存储类型就可以了,并不需要改变工厂。这种方式应该是应用最广泛的一种工厂模式。下面再简单看下它的使用吧:
抽象工厂模式其实和工厂方法的多工厂模式有点类似,容易混淆。这两者的区别是,单工厂方法模式下,一个工厂只能生产一个产品,而抽象工厂模式下,一个工厂需要生产一组产品。比如我这里需要一个工厂能同时生产内存存储对象和SharedPreferece对象。或者,一个工厂能同时生产内存存储对象和磁盘存储对象等等。在实际开发过程中,如果用到了这种抽象工厂模式,那么一般来说,一个工厂能生产的这两个对象之间会有一定的关联性。比如说汽车工厂,它能同时生产出轴承和轮胎,这两者关系就很密切。下面看一下抽象工厂模式:
上面一个工厂可以生产两种产品,当然,上面例子里面工厂的两种产品木有很强的关联。刚才说了,使用到这种抽象工厂方式时,一般一个工厂的产品之间会有一定的关联。就像汽车的轴承和轮胎。相对来说,在日常的开发当中,工厂方法模式可能应用的更广泛一些。
Demo: Factory
设计模式按创建型模式划分
设计模式按创建类型分为如下六种:
1.抽象工厂模式,提供一个创建相关或依赖对象的接口,而不指定对象的具体类。
2.工厂方法模式,允许一个类的实例化推迟到子类中进行。
3.生成器模式,将一个复杂对象的创建与它的表示分离,使同样的创建过程可以创建不同的表示。
4.对象池模式,通过回收不再使用的对象,避免创建和销毁对象时代价高昂的获取和释放资源的过程。
5.原型模式,使用原型实例指定要创建的对象类型,通过复制原型创建新的对象。
6.单例模式,保证一个类只有一个实例,并且提供对这个实例的全局访问方式。

更多文章:
企业为什么需要做战略咨询?国内有什么专业做品牌战略咨询的公司吗我看好多咨询公司的业务范围都五花八门的
2026年5月11日 02:12
合肥到黄山旅游攻略(合肥黄山旅游指南合肥自己的黄山旅游指南)
2026年5月1日 18:22
咨询公司取名(个体咨询服务类公司名称 个体咨询公司怎么取名字)
2026年4月14日 00:04

















