设计模式
MuggleLee
希望通过写博客提高表达能力和自身的技能。
展开
-
设计模式之单例模式(Singleton Pattern)
定义保证一个类只有一个实例,并提供全局访问点。使用场景要求生产唯一序列号。WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。懒汉模式 vs 饿汉模式懒汉模式:很懒。在调用的时候才会创建单例。(延迟加载)饿汉模式:很饿。在系统加载的时候就会创建单例。(预加载)懒汉模式饿汉模式...原创 2019-05-22 10:13:39 · 337 阅读 · 0 评论 -
设计模式之适配器模式(Adapter Pattern)
What:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。Why:优点:1.客户端通过适配器可以透明地调用目标接口;2.复用了现存的类,不需要修改原有代码而重用现有的适配者类,符合开闭原则;3.将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题;缺点:1.Java不支持多重继承,一次最多可以继承一个适配器类;2....原创 2019-05-27 12:30:05 · 321 阅读 · 0 评论 -
设计模式之迭代器模式(Iterator Pattern)
What:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。Why:优点:1.不需要暴露内部表示就可以访问聚合对象;2.支持不同方式遍历聚合对象;3.迭代器简化了聚合类;4.不需要改动原有的代码就可以很方便的增加新的聚合类和迭代器类,符合开闭原则。缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对...原创 2019-05-27 12:31:12 · 220 阅读 · 0 评论 -
设计模式之解释器模式(Interpreter Pattern)
What:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。Why:优点:1.可扩展性比较好,灵活;2.增加新的解释表达式不需改动原有的代码,符合开闭原则;3.易于实现简单文法。缺点:1.当语法规则数目太多时,增加了系统的复杂度;2.解释器模式采用递归调用方法,执行效率低,调试困难;3.对于复杂的文法比较难维护;4.解释器模式...原创 2019-05-27 12:32:04 · 264 阅读 · 0 评论 -
设计模式之模版模式(Template Pattern)
What:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。Why:优点:1.封装不变部分,扩展可变部分。2.提取公共代码,便于维护。3.行为由父类控制,子类实现,符合开闭原则。4.代码复用,减少代码冗余。缺点:1.每一个不同的实现都需要增加子类,导致类数目增加,增加类系统的复杂度;2.由于继承的关系,...原创 2019-05-27 13:32:32 · 165 阅读 · 0 评论 -
设计模式之外观模式(Facade Pattern)
What:外观模式(Facade),也被称为"门面模式"。定义了一个高层、统一的接口,外部通过这个统一的接口对子系统中的一群接口进行访问。Why:优点:1.简化调用流程,客户端不需要知道子系统的实现,提高了安全性,符合“迪特米原则”。2.提高灵活性,降低用户类和子系统类的耦合度,实现了松耦合。3.更好的划分访问层次。缺点:如果新增子系统,需要修改外观类,违背了“开闭原则”。...原创 2019-05-27 13:33:33 · 222 阅读 · 0 评论 -
设计模式之命令模式(Command Pattern)
What:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。Why:优点:1.降低了系统耦合度。2.新的命令可以很容易添加到系统中去。缺点:每个具体操作就需要设计一个具体的命令类,会导致系统有过多的具体命令类,增加系统的复杂性。Where:1.当系统需要将请求调用者与请求接收...原创 2019-06-03 22:54:11 · 279 阅读 · 0 评论 -
设计模式之责任链模式(Chain of Responsibility Pattern)
What:责任链模式也叫职责链模式。为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。Why:优点:1.降低耦合度。它将请求的发送者和接收者解耦。2.增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。缺点:1.责任...原创 2019-06-03 23:51:57 · 367 阅读 · 0 评论 -
设计模式系列
创建型模式:设计模式之工厂模式(Factory Pattern)设计模式之抽象工厂模式(Abstract Factory Pattern)设计模式之建造者模式(Builder Pattern)设计模式之原型模式(Prototype Pattern)设计模式之单例模式(Singleton Pattern)结构型模式:设计模式之适配器模式(Adapter Pattern)设计模式之桥接...原创 2019-06-04 10:42:56 · 935 阅读 · 0 评论 -
设计模式之备忘录模式(Memento Pattern)
What:保存一个对象的某个状态,以便在适当的时候恢复对象。该模式又称快照模式。Why:优点:1.为用户提供一种可恢复的机制,方便用户操作历史回滚。2.封装存档的信息,用户不需知道信息的保存细节。缺点:因为需要保存信息,所以会导致资源占用,特别是保存大对象的时候,有可能出现oom。Where:1.提供一个可回滚的操作。2.需要保存/恢复数据的相关状态场景,譬如文字或图像的编...原创 2019-06-04 10:50:16 · 234 阅读 · 0 评论 -
设计模式之状态模式(State Pattern)
What:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。Why:优点:1、封装了转换规则。2、枚举可能的状态,在枚举状态之前需要确定状态种类。3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。5、可以让多个环境对象共享一个状态...原创 2019-06-04 10:51:24 · 228 阅读 · 0 评论 -
设计模式之抽象工厂模式(Abstract Factory Pattern)
What:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。Why:优点:1.当增加一个新的产品族时不需要修改原代码,满足开闭原则。2.可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。3.当一个族中的多个对象被设计成一起工作时, 它能够保证客户端始终只使用同一个族中的对象。缺点:1.当产品等级中需要增加一个新的产品时,所...原创 2019-05-27 12:28:42 · 322 阅读 · 0 评论 -
设计模式之策略模式(Strategy Pattern)
What:策略是对算法的封装,是一种形为模式,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。Why:优点:1.扩展性良好;2.避免使用多重条件判断,遵循开闭原则;3.算法可以自由切换。缺点:1.所有策略类都需要对外暴露;2.策略类会增多。Where:1.一个系统需要在几种算法中动态地选择一种。2.系统很多类,而区别仅仅在于行为不同。...原创 2019-05-27 12:24:55 · 279 阅读 · 0 评论 -
设计模式之原型模式(Prototype Pattern)
What?是用于创建重复的对象,同时又能保证性能的一种创建型模式。Why优点:1、性能提高。当创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率。因为通过clone创建的一个对象比直接用new创建对象更有效率。2、逃避构造函数的约束。缺点:在实现深克隆的时候可能需要比较复杂的代码。需要为每一个类配备一个克隆方法,而且这个克隆方法需要对类的功能...原创 2019-05-26 00:58:04 · 558 阅读 · 0 评论 -
设计模式之中介者模式(Mediator Pattern)
What:中介者模式使用一个中介对象来封装一系列对象的交互,从而使各对象不需要显式的相互引用,从而使得对象我们耦合松散,而且可以独立地改变对象之间的交互。该模式是用来降低多个对象和类之间的通信复杂性。Why:优点:1、降低了类的复杂度,将一对多转化成了一对一。2、各个类之间的解耦。3、符合迪米特原则。缺点:1.中介者会庞大,变得复杂难以维护。2.如果中介者类出现问题,将会导致所...原创 2019-05-26 00:52:13 · 190 阅读 · 0 评论 -
设计模式之享元模式(Flyweight Pattern)
What:使用共享的方式高效的支持大量的细粒度的对象。Why:优点:1.减少创建的对象数量,减少内存占用和提高性能;2.享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享。缺点:1.享元模式使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化;2.为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使...原创 2019-05-26 00:53:51 · 229 阅读 · 0 评论 -
设计模式之代理模式(Proxy Pattern)
What:为其他对象提供一种代理以控制对这个对象的访问。Why:优点:1.增强目标对象。可以在执行目标对象方法的前后或者其他地方加上验证、日志等等代码;(Spring框架中的AOP)2.将调用对象和被调用对象分离,一定程度上降低了耦合度。扩展性好;3.保护目标对象;4.职责清晰。目标对象就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成,附带的结果就是编程简洁...原创 2019-05-26 00:55:59 · 271 阅读 · 0 评论 -
设计模式之工厂模式(Factory Pattern)
What:工厂模式又称多态性工厂模式。定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。Where:1.创建对象需要大量重复代码;2.客户端不关心实例如何被创建、实现的细节;3.一个类通过子类来指定创建哪个对象。Why:优点:1.一个调用者想创建一个对象,只要知道其名称就可以了。2.扩展性高,如果想增加一个产品,只要扩展一个...原创 2019-05-26 01:00:02 · 602 阅读 · 0 评论 -
设计模式之建造者模式(Builder Pattern)
What:建造者模式是将一个复杂的对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。Why:优点:1.遵循开闭原则。2.对象的建造和表示分离,实现了解耦。3.隐藏了对象的建造细节,用户只需关心产品的表示,而不需要了解是如何创建产品的。缺点:1....原创 2019-05-26 01:01:03 · 378 阅读 · 0 评论 -
设计模式之桥接模式(Bridge Pattern)
What:将抽象部分与它的实现部分分离,使它们都可以独立地变化。Why:优点:1.抽象和实现的分离。2.优秀的扩展能力。3.实现细节对客户透明。缺点:1.增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。2.要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。Where:1.一个类存在两个独立变化的维度...原创 2019-05-26 01:01:52 · 237 阅读 · 0 评论 -
设计模式之观察者模式(Observer Pattern)
What:观察者模式又叫做发布-订阅模式,定义了对象间一对多的依赖关系,使得当对象状态发生变化时,所有依赖它的对象都会收到通知并且自动更新自己。Why:优点:1.观察者和被观察者是抽象耦合的;2.实现广播机制,被观察者可以群发消息给观察者。缺点:1.如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间,影响执行效率。2.如果被观察者和观察者...原创 2019-05-26 01:02:50 · 231 阅读 · 0 评论 -
设计模式之装饰者模式(Decorator Pattern)
What:装饰者模式又名包装(Wrapper)模式。装饰者模式动态地将责任附加到对象身上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。Why:优点:1.装饰者模式比继承灵活性,在不改变原有对象的情况下给对象扩展功能,符合开闭原则。继承关系是静态的,在编译的时候就已经决定了行为,不便于控制增加行为的方式和时机。2.装饰者模式可以动态使用不同的装饰类排列组合,创造出多样的行为组...原创 2019-05-26 01:03:42 · 267 阅读 · 0 评论 -
设计模式之组合模式(Composite Pattern)
What:将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式又称为部分整体模式,该模式将对象组合成树形结构以表示"部分-整体"的层次结构。Why:优点:1、高层模块调用简单;2、节点自由增加。缺点:1.在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则;2.要求较高的抽象性,如果节点和叶子...原创 2019-05-26 01:04:33 · 404 阅读 · 2 评论 -
设计模式之访问者模式(Visitor Pattern)
What:提供一个作用于某对象结构中的各元素的操作表示,它使得可以在不改变各元素的类的前提下定义作用于这些元素的新操作。Why:优点:1.各角色职责分离,符合单一职责原则。2.扩展性好,如果需要新增操作方式,只需要在具体访问者增加方法,灵活性高。3.使得数据结构和作用于结构上的操作解耦,使得操作集合可以独立变化。缺点:1.具体元素对访问者公布细节,违反了迪米特原则。2.增加新...原创 2019-06-04 10:53:29 · 293 阅读 · 0 评论