之前看了headfirst和设计模式,总结了一下自己的理解,现记录下来以备后面查阅
分类的标准为:
Created with Raphaël 2.2.0 开始 创建新对象? 创建型 结束 组装交互? 结构型 行动规则? 行为型 yes no yes no yes no 类型名称创建型工厂、抽象工厂、生成器、原型组合型适配器、桥接、组合、外观、装饰、代理、享元行为型职责链、命令、迭代器、中介者、解析器、观察者、状态、备忘录、模板方法、访问者、策略由子类定义实例化哪个类
伪代码
// 要生成d // 没用工厂 if(env=='a') { A a=new A(); B b=new B(); return new D(a,b); }else{ C c=new C(); return new D(c); } //用了工厂 Creator fa=new FA(); Creator fb=new FB(); if(env=='a'){ return fa.make(); }else{ return fb.make(); } //用了简单工厂 SF sf=new SF(); return sf.make(env);使用者不需要知道怎么创建,只要找工厂生产就好了。
以前:我要用A->我要new A->A构建依赖B C D->我要import B C D并new B C D。 用了工厂模式:我要用A->找A工厂做一个
同1,既然不关心创建,那么构建A的B C D我也可以不用依赖,创建的代码也封装到了工厂里面。
当要用的时候才进行实例化对象,将决定的时点从编码时期后移到运行时,那么就可以使用动态配置来决定实例化的对象类型或者参数。
提供一个接口创建一系列相关的对象,而不需要具体类
伪代码
//要d,e //没用抽象工厂 D d; E e; if(f instanceof creatorD){ d=(creatorD)f.makeD(); } if(f instanceof creatorE){ e=(creatorE)f.makeE(); } //抽象工厂 AbstractFactory f=new FA(); D d=f.makeD(); d.e=f.makeE();以前:CreatorA增加makeA1->改实现CreatorA的工厂 现在:CreatorA增加makeA1->改实现CreatorA的工厂+实现AbstractFactory的工厂
FA extends abstactFactory->生产(钢笔,墨水) FB extends abstactFactory->生产(圆珠笔,笔芯) 怎么做都不会生产出(钢笔,笔芯)但是如果把这四样东西分成四个工厂,那么就有可能组合生产出(钢笔,笔芯)这样的错误搭配
如FA生产钢笔,FB生产铅笔,两者都能写字