前文:
好像在叙述创建型模式之前,咱们还有一件事没有做;设计模式是如何划分为这三大类的,这好像是一个很有意思的事,证明这几种类型应该存在某种共性;---依据“用途”
创建型模式 | 描述如何创建对象即实例化对象 |
---|---|
结构型模式 | 描述如何实现类或对象的组合 |
行为型模式 | 描述类或对象怎样交互以及怎样分配职责 |
创建型理论:
1、简单工厂(基础但不属于此类型):通过一个抽象的工厂类,利用一个具体的创建方法创建单一类实例;
优点:将客户端对象的使用和对象的创建隔离开;
缺点:工厂类中包含所有对象的创建,增删类都会导致更改整个系统,不利于扩展和维护;
用途:工厂类中包含的对象固定或者较少时;
2、工厂方法:通过一个抽象的工厂类,利用一个抽象的创建方法创建单一类实例;
优点:隐藏具体产品实例化的细节;工厂自主判断通过何种派生类来创建对象(多态特性);新增类的时候,无需修改客户端,只需要添加抽象的工厂和具体类;
缺点:系统中类的数目会成对的增加(具体类和具体工厂类);客户端中代码抽象定义,理解度降低;
用途:客户端不知道它所需要的类;
3、抽象工厂:通过一个抽象的工厂类,利用多个抽象方法创建一组相关联的类实例;
优点:抽象工厂模式隔离了具体类的生成,更换一个具体工厂和新的对象容易;
缺点:增加新具体对象等级结构麻烦;
用途:产品结构等级稳定,设计完成后不会向系统中增添已有的具体类;
4、单例模式:创建全局唯一的实例,并向全局提供该示例的访问接口;
优点:单例类封装了唯一的实例;节约系统的资源,无需频繁创建对象;扩展单利模式的创建过程,允许多个可变数目的实例;
缺点:没有抽象层,扩展困难;违背单一职责原则,充当了工厂和产品角色;容易被自动垃圾回收;
用途:全局仅仅需要创建一个对象;客户调用类只允许使用一个公共访问点;
5、建造者模式:将一个复杂对象的构件与它的表示分离,是的同样的额构件过程可以创建不同的表示
优点:相同的创建过程可以创建不同的产品对象;具体建造者耦合度低,方便增添新的建造者;创建过程更为清晰明了;
缺点:建造者创建的产品具又较多的共同点,差异性较低;产品内部结构复杂,增添具体建造者类困难;
用途:对象的创建过程独立于创建该对象的建造类;隔离复杂对象的创建和使用;
6:原型模式:用原型实例指定创建对象的种类,通过拷贝这个原型来创建新的对象
优点:创建新的对象比较复杂的时候,简化创建过程;无需专门的工厂来创建产品,产品的赋值封装在原型类的克隆方法里面;
缺点:对已经存在类进行扩充时,需要修改源代码;对象间存在多重嵌套的时候,克隆过程会更为复杂;
用途:创建新的产品成本大;避免分层工厂类创建分层次的对象;
创建型实例:
背景:
小雷走在成都的街头,碰巧室外下雨,遂于超市避雨,期间,防尴尬,便买了些水果,突然,想把这一场景和设计模式相结合,性大悟,迷之微笑;
工厂方法模式:
该商店有苹果和橘子,但是没有香蕉,偏偏我喜欢吃这个,于是乎和老板商量可以在进购些香蕉;增加一种品种的水果,对应的需要增加一个抽象的买香蕉的进购地点。
抽象工厂模式:
偶然间发现该商店竟然有两种产地的苹果和橘子,刚好可以弥补没有香蕉吃的悲伤;两种产地是不同的抽象工厂,同一产地的苹果和橘子构成了一个产品系列。
单例模式:
还发现盛放苹果和橘子的塑料袋都是一样的,仅仅用来盛放水果;此时塑料袋就是一个单例;
建造者模式:
起初我以为超市老板是通过零售商配送水果给他呢,后来在聊天的过程中,发现原来老板亲自去水果生产地进行购置,这样既保证了货源,也降低了成本;老板就是建造者模式中的指挥者,而盛产水果的产地便是建造者。
原型模式:
如果老板每次都需要这样去挑选水果多麻烦啊,原来老板有自己的安排,事先和产地的果农约定好几种模板水果(尺寸、重量),每次果农按照这个模板进行配送即可;模板水果便是原型。
末尾:
雨停了,小雷发现该回家了,顺便好好沉淀下自己学习的内容,于是乎上文中的场景便被记录了下来,如果读者感觉有意思的话,可以点赞,点关注吆,后期我们定时更新,五一七天乐,设计模式全搞定。