`
yanguz123
  • 浏览: 557279 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

\(^_^)/ 设计模式

 
阅读更多

 从追MM谈Java的23种设计模式

 

 

 

 

    从追MMJava23种设计模式

 

 

 从追MMJava23种设计模式

  1FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯 德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory.

    工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点 是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

  程序代码

  以下是引用片段:

以下是引用片段: 
public class Factory{ 
      public String Boy = "boy" ; 
       public String Girl = "girl" ; 
      public People getPeople (String people){ 
        if (people.equals("boy")){ 
          return new Boy(); 
        }else if(people.equals("girl")){ 
          return new Girl(); 
         
      
    }

  2BUILDERMM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译 机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这 就是我的“我爱你”builder(这一定比美军在伊拉克用的翻译机好卖)

   建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得 产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

  3FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模 式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。

    工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出 具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

  4PROTOTYPE—跟MMQQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是 我的情话prototype了。(100块钱一份,你要不要)

    原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。 原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每 一个类都必须配备一个克隆方法。

  5SINGLETON—俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个 人,那就是我(刚才做了个梦啦,哪有这么好的事)

    单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的 “单一实例”的需求时才可使用。

  以下是引用片段:

以下是引用片段:
    public class SingLeton{ 
      private static SingLeton instance = new SingLeton(); 
      public static SingLeton getInstance(){ 
        return instance; 
      
    }

  6ADAPTER—在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他 作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我)

    适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类 能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。

  7BRIDGE—早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型, 要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了

  桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的 抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

  8COMPOSITEMary今天过生日。“我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己挑。”“这件T恤挺漂亮,买,这 条裙子好看,买,这个包也不错,买。”“喂,买了三件了呀,我只答应送一件礼物的哦。”“什么呀,T恤加裙子加包包,正好配成一套呀, 小姐,麻烦你包起来。”“……”,MM都会用Composite模式了,你会了没有?

    合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成 模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。

  9DECORATORMary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片, 在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一 个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?

    装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个 对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。

  10FAÇADE—我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也 不会。幸好相机有Façade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我 拍张照片了。

    门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用 。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

  11FLYWEIGHT—每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来 ,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是FlyweightMM的名字就是提取出来的外部特征,根据上下文 情况使用。

    享元模式:FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关 键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能 影响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户 端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。

  12PROXY—跟MM在网上聊天,一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?”这些话,真烦人,写个程序 做为我的Proxy吧,凡是接收到这些话都设置好了自动的回答,接收到其他的话时再通知我回答,怎么样,酷吧。

    代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个 人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户 端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不 能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

以下是引用片段:
    public interface FactoryProxy{ 
      public People createBoy(); 
       public People creteGirl(); 
    }

  13CHAIN OF RESPONSIBLEITY—晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上 “Hi,可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处 女呀,快跑!

    责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接

    起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请 求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终 不被任何接收端对象所接受。

  14COMMAND—俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条 让她弟弟带给我。这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送 COMMAND,就数你最小气,才请我吃面。”,

    命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的 对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以 及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

 

 

 

 

 

  15INTERPRETER—俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟MM约会时,只 要做一个Interpreter,照着上面的脚本执行就可以了。

    解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来 解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任 何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象 都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。

  16ITERATOR—我爱上了Mary,不顾一切的向她求婚。

    Mary:“想要我跟你结婚,得答应我的条件”

    我:“什么条件我都答应,你说吧”

    Mary:“我看上了那个一克拉的钻石”

    我:“我买,我买,还有吗?

    Mary:“我看上了湖边的那栋别墅”

    我:“我买,我买,还有吗?

    Mary:“我看上那辆法拉利跑车”

    我脑袋嗡的一声,坐在椅子上,一咬牙:“我买,我买,还有吗?

    ……

    迭代子模式:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集, 聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集 的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色 变化。

  17MEDIATOR—四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这 里拿,赔了钱的也付给我,一切就OK啦,俺得到了四个MM的电话。

    调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些 对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用 转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

  18MEMENTO—同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与 哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。

    备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一 个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

  19OBSERVER—想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知 我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦

    观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生 变化时,会通知所有观察者对象,使他们能够自动更新自己。
  20STATE—跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的 MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点钟?看完电 影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

    状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究 的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变 的时候,其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子 类。

  21STRATEGY—跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目 的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。

    策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得 算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供 。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

  22TEMPLATE METHOD——看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求 、接吻、前戏、动手、爱抚、进去八大步骤(Template method),但每个步骤针对不同的情况,都有不一样的做法,这就要看你随机应变啦(具 体实现);

    模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使 子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻 辑的细节留给具体的子类去实现。

  23VISITOR—情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的 特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品店老板也根据每个 人特点选一张卡,这样就轻松多了;

    访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数 据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可 以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象 中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者 模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

设计模式之工厂模式

 

参考:http://www.cnblogs.com/mypm/archive/2011/02/09/1950130.html

参考:http://www.cnblogs.com/poissonnotes/archive/2010/12/01/1893871.html 

参考:http://www.iteye.com/topic/903228

参考:http://www.iteye.com/topic/651027

参考:http://792881908-qq-com.iteye.com/blog/1447954

参考:http://love05160104.iteye.com/blog/1493330

参考:http://zhaoimpulse.iteye.com/blog/1150483

 

 

 

 

工厂模式的作用是负责实例化同一个接口的多个类。

工厂模式的意义是定义一个创建产品对象的工厂类,由该工厂统一创建继承了同一个接口的多个产品对象。 

所有的产品抽象出一个基类,所有工厂抽象出一个基类,

工厂模式目的就是解耦。解耦目的是为了一个类的开发不影响其依赖类的开发。当依赖类开发需要被依赖的类的时候,就去工厂里面生产一个。工厂里面提供了响应的方法和事例。工厂得到依赖类是通过配置文件获取的,所以工厂类中没任何被依赖类的信息。这样就达到了解耦的目的。

工厂方法模式是完全符合开闭原则的。

使用工厂方法模式足以应付我们可能遇到的大部分业务需求。但是当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的。

 

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 

 

分类:

1)简单工厂模式(Simple Factory):不利于产生系列产品; 

2)工厂方法模式(Factory Method):又称为多形性工厂; 

3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品; 。

 

 

 

一、简单工厂模式

 

简单工厂模式又称静态工厂方法模式。从命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。

在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化。

 

组成:

1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。 

2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。 

3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。 

 

工厂角色

 

public class CarFactory {
	private static final String BENZ = "Benz";
	private static final String BMW = "BMW";

	public static Car getCar(String carType) {
		switch (carType) {
		case BENZ:
			return new Benz();
		case BMW:
			return new BMW();
		default:
			return null;
		}
	}
}

 

 

抽象产品角色

 

public interface Car {
	void drive();
	void stop();
}

 

 

具体产品角色

 

public class Benz implements Car {
	@Override
	public void drive() {
		System.out.println("Benz drive");
	}
	@Override
	public void stop() {
		System.out.println("Benz stop");
	}
}



public class BMW implements Car {
	@Override
	public void drive() {
		System.out.println("BMW drive");
	}

	@Override
	public void stop() {
		System.out.println("BMW stop");
	}
}

 

 

测试调用

public class Test {
	public static void main(String[] args) {
		Car benz = CarFactory.getCar("Benz");
		benz.drive();
		benz.stop();

		Car bmw = CarFactory.getCar("BMW");
		bmw.drive();
		bmw.stop();
	}
}

 

 

 

 

 

 

二、工厂方法模式

 

工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。 

 

组成:

1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 

2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。 

3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。 

4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。 

 

工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代 码。可以看出工厂角色的结构也是符合开闭原则的! 

工厂方法模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来, 从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。 

反过来讲,简单工厂模式是由工厂方法模式退化而来。设想如果我们非常确定一个系统只需要一个实的工厂类, 那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。 

 

抽象工厂角色

 

public interface CarFactory {
	Car getCar();
}

 

 

具体工厂角色

 

public class BenzFactory implements CarFactory {
	@Override
	public Car getCar() {
		return new Benz();
	}
}


public class BMWFactory implements CarFactory {
	@Override
	public Car getCar() {
		return new BMW();
	}
}

 

 

抽象产品角色

 

public interface Car {
	void drive();
	void stop();
}

 

 

具体产品角色

 

public class Benz implements Car {
	@Override
	public void drive() {
		System.out.println("Benz drive");
	}
	@Override
	public void stop() {
		System.out.println("Benz stop");
	}
}


public class BMW implements Car {
	@Override
	public void drive() {
		System.out.println("BMW drive");
	}

	@Override
	public void stop() {
		System.out.println("BMW stop");
	}
}

 

 

调用测试

 

public class Test {
	public static void main(String[] args) {
		CarFactory benzFactory = new BenzFactory();
		Car benz = benzFactory.getCar();
		benz.drive();
		benz.stop();
		
		CarFactory bmwFactory = new BMWFactory();
		Car bmw = bmwFactory.getCar();
		bmw.drive();
		bmw.stop();
	}
}

 

 

 

 

 

 

三、抽象工厂模式

在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。 

 

抽象工厂角色

 

public interface CarFactory {
	Benz getBenz();
	BMW getBMW();
}

 

 

具体工厂角色

 

public class DefaultCarFactory implements CarFactory {
	@Override
	public Benz getBenz() {
		return new Benz();
	}

	@Override
	public BMW getBMW() {
		return new BMW();
	}
}

 

 

抽象产品角色

 

public interface Car {
	void drive();
	void stop();
}

 

 

具体产品角色

 

public class Benz implements Car {
	@Override
	public void drive() {
		System.out.println("Benz drive");
	}

	@Override
	public void stop() {
		System.out.println("Benz stop");
	}
}


public class BMW implements Car {
	@Override
	public void drive() {
		System.out.println("BMW drive");
	}

	@Override
	public void stop() {
		System.out.println("BMW stop");
	}
}

 

 

调用测试

 

public class Test {
	public static void main(String[] args) {
		CarFactory factory = new DefaultCarFactory();
		
		Benz benz = factory.getBenz();
		benz.drive();
		benz.stop();
		
		BMW bmw = factory.getBMW();
		bmw.drive();
		bmw.stop();
	}
}

 

 

 

 

 

总结:

(1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。 

(2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。 

(3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。

 

 

 

 

工厂模式:

(1)简单工厂模式: 

     1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体静态类实现。

     2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

 3) 具体产品角色:工厂类所创建的对象就是此角色的实例。

(2)工厂方法模式:去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。

     1) 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在 java 中它由抽象类或者接口来实现。

     2) 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

     3) 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在 java 中一般有抽象类或者接口来实现。

     4) 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在 java 中由具体的类来实现。

(3)抽象工厂模式:和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。组成和工厂模式差不多。

     1)抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象而且使用抽象工厂模式还要满足一下条件:

     a) 系统中有多个产品族,而系统一次只可能消费其中一族产品。

     b) 同属于同一个产品族的产品以其使用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

设计模式之JDK中的设计模式

 

 

Structural(布局模式) 

Adapter: 

把一个接口或是类变成别的一种。 

 

    java.util.Arrays#asList() 

    javax.swing.JTable(TableModel) 

    java.io.InputStreamReader(InputStream) 

    java.io.OutputStreamWriter(OutputStream) 

    javax.xml.bind.annotation.adapters.XmlAdapter#marshal() 

    javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal() 

 

Bridge: 

把抽象和实现解藕,于是接口和实现可在完全自力开来。 

 

    AWT (供给了抽象层映射于实际的操纵体系) 

    JDBC 

 

Composite: 

让应用者把零丁的对象和组合对象混用。 

 

    javax.swing.JComponent#add(Component) 

    java.awt.Container#add(Component) 

    java.util.Map#putAll(Map) 

    java.util.List#addAll(Collection) 

    java.util.Set#addAll(Collection) 

 

 

 

Decorator: 

为一个对象动态的加上一系列的动作,而不须要因为这些动作的不合而产生多量的持续类。这个模式在JDK中几乎无处不在,所以,下面的列表只是一些典范的。 

 

    java.io.BufferedInputStream(InputStream) 

    java.io.DataInputStream(InputStream) 

    java.io.BufferedOutputStream(OutputStream) 

    java.util.zip.ZipOutputStream(OutputStream) 

    java.util.Collections#checked[List|Map|Set|SortedSet|SortedMap]() 

 

Facade: 

用一个简单的接口包状一组组件,接口,抽象或是子体系。 

 

    java.lang.Class 

    javax.faces.webapp.FacesServlet 

 

Flyweight: 

有效力地存储多量的小的对象。 

 

    java.lang.Integer#valueOf(int) 

    java.lang.Boolean#valueOf(boolean) 

    java.lang.Byte#valueOf(byte) 

    java.lang.Character#valueOf(char) 

 

Proxy: 

用一个简单的对象来庖代一个错杂的对象。 

 

    java.lang.reflect.Proxy 

    RMI 

 

Creational(创建模式) 

 

Abstract factory: 

创建一组有接洽关系的对象实例。这个模式在JDK中也是相当的常见,还有很多的framework例如Spring。我们很轻易找到如许的实例。 

 

    java.util.Calendar#getInstance() 

    java.util.Arrays#asList() 

    java.util.ResourceBundle#getBundle() 

    java.sql.DriverManager#getConnection() 

    java.sql.Connection#createStatement() 

    java.sql.Statement#executeQuery() 

    java.text.NumberFormat#getInstance() 

    javax.xml.transform.TransformerFactory#newInstance() 

 

Builder: 

首要用来简化一个错杂的对象的创建。这个模式也可以用来实现一个 Fluent Interface。 

 

    java.lang.StringBuilder#append() 

    java.lang.StringBuffer#append() 

    java.sql.PreparedStatement 

    javax.swing.GroupLayout.Group#addComponent() 

 

Factory: 

简单来说,遵守需求返回一个类型的实例。 

 

    java.lang.Proxy#newProxyInstance() 

    java.lang.Object#toString() 

    java.lang.Class#newInstance() 

    java.lang.reflect.Array#newInstance() 

    java.lang.reflect.Constructor#newInstance() 

    java.lang.Boolean#valueOf(String) 

    java.lang.Class#forName() 

 

Prototype: 

应用本身的实例创建另一个实例。有时辰,创建一个实例然后再把已有实例的值拷贝畴昔,是一个很错杂的动作。所以,应用这个模式可以避免如许的错杂性。 

 

    java.lang.Object#clone() 

    java.lang.Cloneable 

 

Singleton: 

只容许一个实例。在 Effective Java中建议应用Emun. 

 

    java.lang.Runtime#getRuntime() 

    java.awt.Toolkit#getDefaultToolkit() 

    java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment() 

    java.awt.Desktop#getDesktop() 

 

Behavioral(行动模式) 

 

Chain of responsibility: 

把一个对象在一个链接传递直到被处理惩罚。在这个链上的所有的对象有雷同的接口(抽象类)但却有不合的实现。 

 

    java.util.logging.Logger#log() 

    javax.servlet.Filter#doFilter() 

 

Command: 

把一个或一些号令封装到一个对象中。 

 

    java.lang.Runnable 

    javax.swing.Action 

 

Interpreter: 

一个语法申明器的模式。 

 

    java.util.Pattern 

    java.text.Normalizer 

    java.text.Format 

 

Iterator: 

供给一种一致的办法来次序遍历一个容器中的所有元素。 

 

    java.util.Iterator 

    java.util.Enumeration 

 

Mediator: 

用来削减对象单的直接通信的依附关系。应用一个中心类来经管消息的标的目标。 

 

    java.util.Timer 

    java.util.concurrent.utor#execute() 

    java.util.concurrent.utorService#submit() 

    java.lang.reflect.Method#invoke() 

 

Memento: 

给一个对象的状况做一个快照。Date类在内部应用了一个long型来做这个快照。 

 

    java.util.Date 

    java.io.Serializable 

 

Null Object: 

这个模式用来解决若是一个Collection中没有元素的景象。 

 

    java.util.Collections#emptyList() 

    java.util.Collections#emptyMap() 

    java.util.Collections#emptySet() 

 

Observer: 

容许一个对象向所有的侦听的对象广播本身的消息或事务。 

 

    java.util.EventListener 

    javax.servlet.http.HttpSessionBindingListener 

    javax.servlet.http.HttpSessionAttributeListener 

    javax.faces.event.PhaseListener 

 

State: 

这个模式容许你可以在运行时很轻易地按照自身内部的状况改变对象的行动。 

 

    java.util.Iterator 

    javax.faces.lifecycle.LifeCycle#execute() 

 

Strategy: 

定义一组算法,并把其封装到一个对象中。然后在运行时,可以灵活的应用此中的一个算法。 

 

    java.util.Comparator#compare() 

    javax.servlet.http.HttpServlet 

    javax.servlet.Filter#doFilter() 

 

Template method: 

容许子类重载项目组父类而不须要完全重写。 

 

    java.util.Collections#sort() 

    java.io.InputStream#skip() 

    java.io.InputStream#read() 

    java.util.AbstractList#indexOf() 

 

Visitor: 

 

感化于某个对象群中各个对象的操纵. 它可以使你在不改变这些对象本身的景象下,定义感化于这些对象的新操纵. 

 

    javax.lang.model.element.Element 和javax.lang.model.element.ElementVisitor 

    javax.lang.model.type.TypeMirror 和javax.lang.model.type.TypeVisitor 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
设计模式之Struts2中的设计模式
 

在Struts2中,其拦截器结构的设计,是一个典型的责任链模式的应用。首先将整个执行划分成若干相同类型的元素,每个元素具备不同的逻辑责任,并将他们纳入到一个链式的数据结构中(我们可以把堆栈结构也看作是一个递归的链式结构),而每个元素又有责任负责链式结构中下一个元素的执行调用。
这样的设计,从代码重构的角度来看,实际上是将一个复杂的系统,分而治之,从而使得每个部分的逻辑能够高度重用并具备高度可扩展性。所以,Interceptor结构实在是Struts2/Xwork设计中的精华之笔。
Struts2拦截器执行机理如下:
1. 整个结构就如同一个堆栈,除了Action以外,堆栈中的其他元素是Interceptor
2. Action位于堆栈的底部。由于堆栈"先进后出"的特性,如果我们试图把Action拿出来执行,我们必须首先把位于Action上端的Interceptor拿出来执行。这样,整个执行就形成了一个递归调用
3. 每个位于堆栈中的Interceptor,除了需要完成它自身的逻辑,还需要完成一个特殊的执行职责。这个执行职责有3种选择:
1) 中止整个执行,直接返回一个字符串作为resultCode
2) 通过递归调用负责调用堆栈中下一个Interceptor的执行
3) 如果在堆栈内已经不存在任何的Interceptor,调用Action

 

 

 

Struts2的设计模式:MVC模式: 
1,web应用程序启动时就会加载并初始化ActionServler。 
2,用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据, 
3,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果 Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。 
4,Execute()从 ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象, 
5,ActionServlet再把客户请求转发给 ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。 

Struts的工作流程: 
  在web应用启动时就会加载初始化ActionServlet,ActionServlet从 
  struts-config.xml文件中读取配置信息,把它们存放到各种配置对象 
  当ActionServlet接收到一个客户请求时,将执行如下流程. 
  -(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息; 
  -(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
  -(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法; 
  -(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象,就表示表单验证成功; 
  -(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法; 
  -(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给ActionForward对象指向的JSP组件; 
  -(7)ActionForward对象指向JSP组件生成动态网页,返回给客户; 
   
为什么要用struts: 
  JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱,所以在此之上,我们需要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。 
  基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件.

 

 

 

 

 

 

 

 

 

 
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics