学习笔记 --设计模式 part 1
前言
之前看了headfirst和设计模式,总结了一下自己的理解,现记录下来以备后面查阅
设计模式列举
分类的标准为:
类型 | 名称 |
---|---|
创建型 | 工厂、抽象工厂、生成器、原型 |
组合型 | 适配器、桥接、组合、外观、装饰、代理、享元 |
行为型 | 职责链、命令、迭代器、中介者、解析器、观察者、状态、备忘录、模板方法、访问者、策略 |
工厂模式
定义
由子类定义实例化哪个类
图例
代码示例
伪代码
// 要生成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);
好处
1 使用与创建解耦
使用者不需要知道怎么创建,只要找工厂生产就好了。
以前:我要用A->我要new A->A构建依赖B C D->我要import B C D并new B C D。
用了工厂模式:我要用A->找A工厂做一个
2 减少依赖,增加复用
同1,既然不关心创建,那么构建A的B C D我也可以不用依赖,创建的代码也封装到了工厂里面。
3 延迟决定实例化对象的时点
当要用的时候才进行实例化对象,将决定的时点从编码时期后移到运行时,那么就可以使用动态配置来决定实例化的对象类型或者参数。
抽象工厂
定义
提供一个接口创建一系列相关的对象,而不需要具体类
图例
代码示例
伪代码
//要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();
好处
1 创建方法定义与实现进一步解耦
2 动态化创建方法
3 聚合多个创建接口,适合创建有关联的产品
坏处
1 增加创建对象时,代价会增大
以前:CreatorA增加makeA1->改实现CreatorA的工厂
现在:CreatorA增加makeA1->改实现CreatorA的工厂+实现AbstractFactory的工厂
对比
抽象工厂VS工厂VS简单工厂
抽象工厂
适合创建多个有关联的产品,并且隔离不同工厂的产品
FA extends abstactFactory->生产(钢笔,墨水)
FB extends abstactFactory->生产(圆珠笔,笔芯)
怎么做都不会生产出(钢笔,笔芯)但是如果把这四样东西分成四个工厂,那么就有可能组合生产出(钢笔,笔芯)这样的错误搭配
工厂
适合生产一类产品,彼此之间有共通功能但不相关
如FA生产钢笔,FB生产铅笔,两者都能写字