HeadFirst设计模式 读书笔记2

来源:互联网 发布:node 执行命令行 编辑:程序博客网 时间:2024/05/29 14:18
烘烤OO的精华
    认识工厂方法模式
       所有工厂模式都是用来封装对象的创建
       工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。
    组成元素
       创建者Creator类
          它定义了一个抽象的工厂方法,让子类实现此方法制造产品。
          创建者通常会包含依赖于抽象产品的代码,而这些抽象产品由子类制造。创建者不需要真的知道在制造哪种具体产品。
       产品类:工厂生产产品。对PizzaStore来说,产品就是Pizza。
    另一个观点:平行的类层级
       为什么产品类和创建者类是平行的?都是抽象类,且都有许多具体的子类,每个子类都有自己特定的实现。
       NYPizzaStore所封装的是关于如何制作纽约风味的比萨。工厂方法就是封装这种知识的关键所在。
    工厂方法模式 
       定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
   
要点:
       Creator是一个类,它实现了所有操作产品的方法,但不实现工厂方法。
       Creator所有的子类都必须实现这个抽象的factoryMethod方法。
       所有的产品必须实现一个共同的接口,这样一来,使用这些产品的类,就可以引用这个接口,而不是具体类。
       ConcreteCreator实现了factoryMethod,以实际制造出产品。
       ConcreteCreator负责创建一个或多个具体产品,只有ConcreteCreator类知道如何创建这些产品。
    设计原则:要依赖抽象,不要依赖具体类。
    依赖倒置原则,不能让高层组件依赖低层组件,而且不管高层或低层组件,2者都应该依赖于抽象。
       所谓高层组件,是由其他低层组件定义其行为的类。
       例如,PizzaStore是个高层组件,因为它的行为是由比萨定义的。
    依赖倒置原则,究竟倒置在哪里?
    避免OO设计中违反依赖倒置原则
       1变量不可以持有具体类的引用。
          如果使用new,就会持有具体类的引用。你可以改用工厂来避开这样的做法。
       2不要让类派生自具体类。
          如果派生自具体类,你就会依赖具体类,请派生自一个抽象(接口或抽象类)
       3不要覆盖基类中已实现的方法。
          如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被集成的抽象。基类中已实现的方法,应该由所有的子类共享。
    抽象工厂模式
       提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
   
比较工厂方法和抽象工厂。。。
    要点1:
       所有的工厂都是用来封装对象的创建。
       简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。
       工厂方法使用集成:把对象的创建委托给子类,子类实现工厂方法来创建对象。
       抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中。
       所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合。
       工厂方法允许类将实例化延迟到子类进行。
       抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。
       依赖倒置原则,知道我们避免依赖具体类型,而要尽量依赖抽象。
       工厂是很有为例的技巧,帮助我们针对抽象编程,而不要针对具体类编程。

独一无二的单件模式:用来创建第一无二的,只能有一个实例的对象的入场券。
    单件模式
       确保一个类只有一个实例,并提供一个全局访问点。
   
要点
       单件模式确保程序中一个类最多只有一个实例。
       单件模式也提供访问这个实例的全局点。
       在Java中实现单件模式需要私有的构造器,一个静态方法和一个静态变量。
       确定在性能和资源上的限制,然后小心地选择适当的方案来实现单件,以解决多线程的问题(我们必须认定所有的线程都是多线程的)
       如果不是采用第五版的java2,双重检查枷锁实现会失效。
       小心,你如果使用多个类加载器,可能导致单件失效而产生多个实例。
       如果使用JVM1.2或之前的版本,你必须建立单件注册表,以免垃圾收集器将单件回收。

这些绝密文件的投递箱已经促成了间谍工业的革命。我只要把需求丢进去,就有人会消失,政府一夕之间改朝换代,而我的干洗衣物也好了。我不必管何时何地或者如何完成,反正就是完成了。
    在本章,我们把封装带到一个全新的境界:把方法调用封装起来。
    加载调用者
       客户创建一个命令对象。
       客户利用setCommand将命令对象存储在调用者中。
       稍后……客户要求调用者执行命令。请注意:一旦命令被加载到调用者,该命令可以被使用并丢弃,或者可以被保留下来并使用许多次。
    餐厅应用到命令模式的相应名称
       女招待   Invoke
       快餐厨师   Receiver
       orderUp()   execute()
       订单   Command
       顾客    Client
       takeOrder()   setCommand()
    命令模式
       将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
      
命令对象将动作和接收者包进对象中。这个对象只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。
    NoCommand对象是一个空对象的例子。当你不想返回一个有一一的对象时,空对象就很有用。
       客户也可以将处理null的责任转移给空对象。
    命令模式的更多用途
       队列请求
          命令可以将运算快打包(一个接受者和一组动作),然后将它传来传去,就像是一般的对象一样。
       日志请求
    要点
       命令模式将发出请求的对象和执行请求的对象解耦。
       在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接受者和一个或一组动作。
       调用者通过调用命令对象的execute发出请求,这会使得接收者的动作被调用。
       调用者可以接受命令当参数,甚至在运行时动态地进行。
       命令可以支持撤销,做法是实现一个undo方法来回到execute被执行前的状态。
       宏命令是命令的一种简单的延伸,允许调用多个命令。宏方法也可以支持撤销。
       实际操作时,很常见使用聪明命令对象,也就是直接实现了请求,而不是将工作委托给接收者。
       命令也可以用来实现日志和事务系统。

原创粉丝点击