目录
简介
今天给大家分享一下设计模式的创建型模式(简单工厂模式、工厂方法模式、抽象工厂模式、原型模式、建造者模式、单例模式)这里简单工厂模式又叫做静态工厂方法模式,是通过专门定义一个类负责创建其他类的实例,被创建的实例通常都具有共同父类,但是简单工厂并不在23个设计模式当中。
创建型模式
主要用于如何创建对象,实例化对象,但是,这可能会限制在系统内创建对象的类型或数目。
一、工厂三兄弟(简单工厂模式、工厂方法模式、抽象工厂模式)
光工厂模式就有三种,刚开始学的时候还能分的清楚,到后面越来越像了,总的来说目的都是为了可维护,可复用,可拓展,灵活性好;手段是封装继承和多态;原则是六大原则。
三个工厂的不同点
简单工厂模式的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对客户端来说,去除了与具体产品的依赖。
工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现要实现的类。工厂方法是把简单工厂的内部逻辑判断移动到了客户端,想要添加功能还得修改客户端。工厂方法是在简单工厂上把工厂细分通过接口来实现的。
抽象工厂模式是把工厂方法的一个接口拓展为多个。
可以看出这三个兄弟是层层递进关系。如何分清这三个模式呢?接下来我用生活内容举例
1、简单工厂模式
现实举例:
你想要开车出门,我们只是想要单纯的开车去往某个地方办我们自己的事,车只要给钱买下来就能开,而如何制造一辆车并不是我们关心的,也不用费劲心思去造车,实在不行就骑自行车也行啊,再不行就走着知道到达自己想要到达的目的地就可以了,但这跟常规的方法有什么区别呢?没有用到设计模式。
不从工厂买车回来就违背了简单工厂模式了,使用四个轱辘的车会让我们更方便快捷的到达目的地,让我们办事更有效率。
但这个工厂只可以制造这种简单四个轱辘的车,只有一套制造流程。在系统扩展上违背了开放封闭的原则。
优点:
- 用户不用直接创建对象,只需要消费使用对象就可以了(开车)。实现了将对象的创建和使用分离。
- 客户端不需要改动任何代码的情况下更换或者增加新的具体产品,提高了系统的灵活性。
缺点:
- 如果工厂的业务过多,导致职责过重,业务逻辑复杂,不利于系统扩展和维护,使系统受到影响。
适用范围:
- 工厂负责创建的对象少,业务简单。客户端只需要传入工厂类参数,不需要关心对象是如何创建的。
2、工厂方法模式
现实举例:
众所周知在汽车行业众泰的山寨技术最为成功,这里拿两个来举例模仿最成功的山寨车,换个车标连亲妈都分不出来,为什么山寨的连亲妈都认不出来呢?因为针对仿造的汽车都有针对专门的工厂来生产,这样就比简单工厂高级不需要再改动工厂来添加新产品。
如果众泰想要再山寨新的车,就新建造一个工厂,虽然比较费钱但是质量好,达到了真假美猴王的效果
(不知道众泰是否真的是这么做的,但可以这样来帮助理解工厂方法模式)
优点:
- 允许系统在不修改具体工厂角色的情况下引进新产品
缺点:
- 由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量
适用场景:
- 用户不需要知道有什么样的产品,只需要调用自己想要的具体产品,以及生产该产品的工厂。
- 根据客户需求,抽象工厂提供一个接口或者父类,具体工厂只需要继承该父类,重写生产具体产品的方法即可
3、抽象工厂模式
现实举例
大家都知道宝马和奔驰两家公司争斗有很久了,在汽车行业两家公司做的都非常好,于是又想摩托车行业伸出魔爪来扩张势力成为一个系列,大家也知道这两家公司不止是有汽车摩托车还有公交等一系列,汽车产品都去汽车工厂生产,摩托车产品都去摩托车工厂生产。
优点:
- 具体工厂可创建一系列的产品。
缺点:
- 每个具体增加产品是一系列的产品,这一系列产品具有等级关系,当再次增加某一种产品时,需要对原有的系统进行大规模修改。违背了一国两制原则。
适用场景:
- 同一个产品系的产品一起使用,产品等级结构稳定,设计完成之后,不可独立增加具体产品。
二、原型模式
在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且当我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,未免会增加创建类的复杂度和耗费系统复杂程度,所以使用工厂模式来封装类创建过程并不合适,由此产生了原型模式。
通过MemberwiserClone来实现。
深复制VS浅复制
1、深复制:
指的是复制一个对象时,不仅仅把对象的引用进行复制,还把该对象引用的值也一起拷贝。这样进行深复制后的复制对象就和源对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。
现实举例:
一个人叫张三,然后使用克隆技术以张三来克隆另外一个人叫李四,这样张三和李四就是相互独立的,不管张三缺胳膊还是李四少腿了都不会影响另外一个人。
2、浅复制:
指的是拷贝一个对象时,仅仅复制对象的引用进行复制,但是复制对象和源对象还是引用同一份实体。此时,其中一个对象的改变都会影响到另一个对象。
现实举例:
还是那个叫张三的人,后来改名字为张老三了,可是他们还是同一个人,不管张三缺胳膊还是张老三少腿,都反应在同一个人身上。
优点:
- 当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程
- 扩展性较好
缺点:
- 需要为每一个类配备一个克隆方法,克隆方法位于类的内部,当对类进行改变时需要修改原代码。违背一国两制原则。
三、建造者模式
现实举例:
刚过了双11马上又要到到双12了你打开淘宝闲逛,发现了一个你喜欢的物件决定要买它,但现在还是抽象的因为你还没决定好要什么颜色多大体型,目前一切都是抽象的。当你全部都决定好点击确定这个步骤就是实现抽象接口给它实例化了,最后由淘宝店主给你打包发送来指挥送达到你要邮寄的地方。
制造过程和拼装过程分离,实际的打包邮寄过程无需了解!
最后我们收到了在淘宝上选择的产品达到了自己的目的。这就是客户端实例化了指挥者。
我们对比一下抽象工厂,抽象工厂可以创建一系列的产品,而建造者模式可创建部分产品。
优点:
- 只需要再定义一个具体的建造者就可以啦
- 易扩展,便于风险控制。
缺点:
- 产品必须有共同点,范围局限,不适合组成不同产品。
适用场景:
- 具体产品是由多个小产品组成,适合创建复杂的对象。
- 相同的创建过程,不同的产品。
四、单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点使一个对象被访问。
lock是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程视图进入锁定的代码,则它将一直处于等待,直到对象被释放!
锁还有单锁双锁之分。
优点:
- 单例模式提供了对唯一实例的访问。
- 在系统内存中只存在一个对象,所以可以节约系统资源。
缺点:
- 单例扩展有较大困难。
适用场景:
- 系统只有一个实例对象,外界通过公共访问点访问该实例。
注:总结了将近一天的创建型模式,随学随总结小编脑子已经不转了。如果读者感觉有意思的话记得帮忙点赞哦~