设计模式
Java设计模式
张行之
闻道有先后,术业有专攻。
展开
-
单例模式
单例模式分为:饿汉式和懒汉式类图: 饿汉式:public class SingleBitmap {/** * 饿汉式 */ private static SingleBitmap sSingleBitmap = new SingleBitmap(); private SingleBitmap() { }/** * 饿汉式 * @return */ public原创 2016-01-28 21:00:38 · 794 阅读 · 0 评论 -
策略模式
五一去旅游为例:五一大家都去旅游,大家都选择不一样的出行方式。如:火车(K,G),飞机,汽车等。人也不一样,有Rich,Middle,Poor等三类人。人(People):拥有去旅行的方法,如:go(String ticket);需要选择出行的方式:TripMode。出行方式(TripMode):出行方式是独立的,所以定义成接口。不管如何出行,都需要这几个方法,买票(buyTicket),改签(me原创 2016-05-04 13:15:15 · 625 阅读 · 0 评论 -
观察者模式
场景:犯罪集团专门负责贩毒和洗黑钱2种犯罪活动。公安部新成立2个部门,一个负责扫毒,一个负责打击洗钱犯罪。公安部决定派出卧底,打入犯罪集团的内部,获取犯罪集团的证据和在犯罪活动的发生时通知对应的部门,进行逮捕行动。类图: 犯罪集团:public class CrimeGroup extends Observable { private boolean isFanDu; private原创 2016-05-06 16:51:53 · 2053 阅读 · 0 评论 -
装饰者模式
场景:去吃黄焖鸡米饭,发现除了黄焖鸡米饭外,还可以额外的加菜些配菜(Garnish )分析: 黄焖鸡和配菜都是食物(Food),黄焖鸡是主菜,其他的是配菜,配菜就属于装饰者。装饰者模式:个人愚见就是给主菜中添加一些配菜,添加装饰作用。有一点很重要,就是在不改变类的行为的情况下,给它添加额外的功能。这里涉及到一个原则:开闭原则(对拓展开放,对修改关闭)。当然,通过继承也可以实现,但是继承的耦合性太强原创 2016-05-13 19:33:53 · 479 阅读 · 1 评论 -
工厂模式(一)--简单工厂模式
简单工厂模式(也称为静态工厂模式)简单工厂模式的作用:通过一个类去实例化对象,不需要直接把类的创建写在逻辑中,达到一定程度的解耦,方便维护。但是未遵循开闭原则。看一下例子: 场景:现在有一个工厂,承接了小米,华为,苹果3个品牌手机制造。手机类public abstract class Phone { public abstract String getDescript(); publ原创 2016-05-19 17:36:25 · 400 阅读 · 0 评论 -
工厂模式(二)--工厂方法模式
工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法就是让类把实例化推迟到子类。工厂方法模式与简单工厂模式的区别: 两者都实现了类的实例化与类的行为之间的解耦。如果需要添加需求,对于简单工厂来说需要修改工厂中的代码。未遵循开闭原则(对拓展开放,对修改关闭),工厂方法模式只需要写个类实现工厂接口,遵循开闭原则。类图: 场景: 手机实例化(Phone)是需要手机工厂(原创 2016-05-19 17:44:39 · 458 阅读 · 0 评论 -
工厂模式(三)--抽象工厂模式
抽象工厂模式:当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。抽象工厂模式与工厂方法模式的区别: 工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。类图: 场景:现在有2个产品,手机(Phone)和平板(Pad),我们需要一个工厂(IFactory)生产2中产品,现在有2个原创 2016-05-19 19:41:02 · 452 阅读 · 0 评论 -
命令模式
命令模式:在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern)。命令模式的本质:对命令进行封装,将发出命令的责任和执行命令的责任分割开。优原创 2016-05-20 14:16:04 · 500 阅读 · 0 评论 -
建造者模式(生成器模式)
建造者模式定义:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。类图适用范围1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。2 当构造过程必须允许被构造的对象有不同表示时。角色1 builder:为创建一个产品对象的各个部件指定抽象接口。2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个原创 2016-06-02 15:05:01 · 670 阅读 · 0 评论 -
原型模式
原型模式定义:Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。原型模式的优点及适用场景使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方原创 2016-06-06 17:54:02 · 517 阅读 · 0 评论 -
状态模式
状态模式定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。使用场景:一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。一个操作中含有庞大的多分支结构(if..else),并且这些分支决定于对象的状态。类图:模式中的角色:上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Conc原创 2016-06-08 11:18:56 · 425 阅读 · 0 评论 -
代理模式:静态代理与动态代理
代理模式定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。组成:抽象角色:通过接口或抽象类声明真实角色实现的业务方法。代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调原创 2016-07-11 18:35:20 · 516 阅读 · 0 评论 -
备忘录模式
备忘录模式定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。类图:备忘录模式的角色:发起人(Originator):要被备份的成员,它提供一创建备忘录的方法,其实就是将它自身的某些信息拷贝一份到一个备忘录对象中。并提供另外一个方法将备忘录中的信息覆盖自身的信息。备忘录(Memento):备忘录对象中包含存储发起人状态的成员变原创 2016-07-21 11:51:56 · 532 阅读 · 0 评论 -
静态工厂与策略模式的比较
静态工厂模式与策略模式的比较静态工厂模式:一般采用if…else语句或switch语句通过条件判断,并返回结果。这样写起来是比较方便的,适用于不复杂的类,但是该模式耦合程度比较高。策略模式:通过由实现类实现行为接口,在操作类中切换不同实现类的行为。这样写起来比较解耦,但是会导致类增多。适用于行为比较复杂的类。接下来看下实例代码:静态工厂模式:public class DateUtils { p原创 2016-12-06 12:57:44 · 865 阅读 · 0 评论 -
责任链模式
责任链模式#### 定义:在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。#### 责任链模式涉及到的角色如下所示:抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义原创 2017-01-09 17:02:32 · 465 阅读 · 0 评论 -
解释器模式
解释器模式定义:提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。解释器角色:抽象解释器具体的解释任务由各个实现类完成,具体的解释器分别为终结解释器和非终结解释器。终结解释器实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结 表达式,但有多个实例,对应不同的终结符。非终结解释器文法中的每条规则对应于一个非终结表达原创 2017-01-10 11:03:13 · 353 阅读 · 0 评论 -
迭代器模式
迭代器模式定义:迭代器模式是一种行为型模式,这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。主要解决:不同的方式来遍历整个整合对象优点: 它支持以不同的方式遍历一个聚合对象。迭代器简化了聚合类。 在同一个聚合上可以有多个遍历。在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新原创 2017-01-10 12:23:11 · 345 阅读 · 0 评论 -
模板模式
模板模式定义:模板模式是行为型模式的一种。它的定义是一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。优点: 封装不变部分,扩展可变部分。 提取公共代码,便于维护。 行为由父类控制,子类实现。缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。使用场景: - 有多个子类共有的方法,且逻辑相同。 -原创 2017-01-10 14:44:18 · 336 阅读 · 0 评论 -
适配器模式
适配器模式定义:适配器模式(Adapter Pattern)两个不兼容的接口之间的桥梁,将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。优点: 可以让任何两个没有关联的类一起运行。 提高了类的复用。增加了类的透明度。 灵活性好。缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握。由于 JAVA 至多继承一个类,所以原创 2017-01-10 16:11:08 · 417 阅读 · 0 评论 -
外观模式
外观模式定义:外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。优点: 减少系统相互依赖。 提高灵活性。 提高了安全性。缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。使用场景: 为复杂的模块或子系统提供外界访问的模块。子系统相对独立。主要原创 2017-01-10 18:35:02 · 357 阅读 · 0 评论 -
组合模式
组合模式定义组合模式又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。优点: - 高层模块调用简单。 - 节点自由增加。缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖原创 2017-01-10 22:05:40 · 348 阅读 · 1 评论 -
桥接模式
桥接模式定义:桥接模式(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。优点: - 抽象和实现的分离。 - 优秀的扩展能力。 - 实现细节对客户透明。缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。使用场景: -原创 2017-01-12 16:25:09 · 674 阅读 · 0 评论 -
享元模式
享元模式定义:享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。优点:大大减少对象的创建,降低系统的内存,使效率提高。缺点:提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。使用场原创 2017-01-12 20:03:14 · 454 阅读 · 0 评论