定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。 当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过访问具体工厂的工厂方法newProduct()来创建产品。 具体工厂(Concrete Factory):主要是实现抽象工厂方法中的抽象方法,完成具体产品的创建。 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。 优点:无需将特定应用程序的类绑定到代码 缺点:客户可能需要创建Creator的子类,以便他们可以创建特定的ConcreteProduct
提供接口以创建一组相关/相互依赖的对象,但不需要指明其具体类。
保证了从属状态和主状态必须一致,“粉丝”对“偶像”感兴趣,希望随时得知偶像的一举一动。粉丝到偶像那里注册,偶像一旦有新闻发生,就推送给已注册的粉丝。
visitor和各种对象之间的比较: 迭代器:以遍历的方式访问集合数据而无需暴露其内部表示,将“遍历”这项功能delegate到外部的iterator对象。 visitor:在特定的ADT上执行某种特定的操作,但该操作不在ADT内部实现,而是delegate到独立的visitor对象,客户端可灵活扩展/改变visitor的操作算法,而不影响ADT。
关于Strategy和visitor 而后则都是delegation建立两个对象的动态联系: 但是visitor强调的是外部定义某种对ADT的操作,该操作与ADT自身关系不大(只是访问ADT),故ADT内部只需要开放accept(visitor)即可,client通过它设定visitor操作并在外部调用。 而strategy则强调是对ADT内部某些要实现的功能的相应的算法的灵活替换。这些算法是ADT功能的重要组成部分,只不过是delegate到外部strategy类而已。 visitor是站在外部client的角度,灵活增加对ADT的各种不同操作,灵活增加对ADT的各种不同操作(哪怕ADT没实现该操作),strategy则是站在内部ADT的角度,灵活变化对其内部功能的不同配置。