学习笔记 --设计模式 part 1

    科技2024-10-11  33

    学习笔记 --设计模式 part 1

    前言设计模式列举工厂模式定义图例代码示例好处**1 使用与创建解耦**2 减少依赖,增加复用3 延迟决定实例化对象的时点 抽象工厂定义图例代码示例好处1 创建方法定义与实现进一步解耦2 动态化创建方法3 聚合多个创建接口,适合创建有关联的产品 坏处1 增加创建对象时,代价会增大 对比抽象工厂VS工厂VS简单工厂抽象工厂适合创建多个**有关联**的产品,并且隔离不同工厂的产品 工厂适合生产一类产品,彼此之间有共通功能但不相关 简单工厂实际上就是把创建的代码抽出封装到工厂,相比工厂和抽象工厂抽象度低,没有多态,只是形态像工厂

    前言

    之前看了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);

    好处

    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生产铅笔,两者都能写字

    简单工厂

    实际上就是把创建的代码抽出封装到工厂,相比工厂和抽象工厂抽象度低,没有多态,只是形态像工厂

    Processed: 0.037, SQL: 8