设计模式之男孩女孩(二)

来源:互联网 发布:济南链企网络 编辑:程序博客网 时间:2024/05/08 04:37

 

        【场景】
        晚上男孩(Boy)在女孩(Girl)家第一次陪她过生日,当然还有她的朋友。晚餐后,女孩(Girl)的朋友都走了,女孩(Girl)最后一个送男孩(Boy)出去。在快分手的时候女孩(Girl)突然说想看电影。男孩(Boy)愣了一下,随后打电话咨询当前各电影院的播发电影,最后选择一个播发“哼唱”的电影院。在出电影院的时候,因人多男孩(Boy)顺势牵上了女孩(Girl)的手,就这样男孩(Boy)送女孩(Girl)回家。(待续……)

       【需求】
        男孩(Boy)想要了解(得到)当前各电影院的播发电影,只要通过一个方法(电话咨询)就可以得到。

       【分析】
        咋看下,上面所描述的场景跟要所讲的模式没有关系。可世间万物的道理是一样的,追究其宗点肯定有个最根本的原理。就象所有物体都有原子、分子组成一样。
        “电话咨询”是一个得到当前各电影院的播发电影的“方法”,象我们常见的114。而114等无非也就是通过各电影院提供的播放清单得到。也就是说是电影院提供自己要播发的电影,创建要播发的“电影”是具体的电影院。
        谁都知道电影院播发电影,这里说的“电影院”、“电影”是接口或抽象类。
        而具体的电影院才提供具体播发的电影,也就是由子类(具体的电影院)来决定具体实例化那个类(具体播发的电影)。 

        【作用意图】
        就是定义了一个创建对象的接口或抽象类(电影院接口),由子类(具体的电影院)来决定要实例化的类(具体播发的电影)是哪一个。
        把类(具体播发的电影)的实例化推迟到子类(具体的电影院)。通过让子类决定该创建的对象是什么,来达到封装对象创建过程的目的。

        【使用场合】 
        一个类不知道它所必须要创建对象的类;(电影院基类是不知道具体的电影院播发的电影)
        一个类希望由它的子类来指定它所创建的对象;(由具体的电影院创建具体要播发的电影)
    
        【效果】
        优点:当我们要获取当前各电影院的播发电影,只需要知道具体的电影院对象和获取播发电影的方法就可以,而不用直接去创建电影对象。
        缺点:当要添加一个新的电影(产品对象)时,需要添加一个具体对象(具体播发的电影)以及一个具体工厂对象(具体的电影院),但原有的代码不变。

        【加深理解】
        大家可能看到我们也可以直接用“简单工厂”的模式,根据参数直接实例一个电影对象。的确是可以的,但这个是不符合“开放-封闭”原则。另外“简单工厂”并不是GOF的23种设计模式之一。

        开放-封闭原则(OCP:The Open-Closed Principle):是OOD原则的一个基石。最早是由Bertrand Meyer提出,
英文的原文是:Software entities should be open for extension,but closed for modification。意思是说:一个软件实体应当对扩展开放,对修改关闭。也就是说,我们在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,换句话说就是,应当可以在不必修改源代码的情况下改变这个模块的行为。

        为什么会有设计模式的存在?在面对需求的多样性、异动性,这需要我们在设计系统时,要注意系统的扩展性,把可能异动的部分封装起来。这也将给代码重构提供方便。

        简单工厂和工厂方法是可以相互演变的,关键看当要创建的对象(电影)是否是固定不变的:
                当固定不变的时候:工厂方法就可以演变成简单工厂,所以简单工厂可以看做参数化的工厂方法。
                                                    (比如根据电影名称就可以直接获取电影对象。) 
                当需要改变的时候:简单工厂就可以改装成工厂方法。
  
        简单工厂和工厂方法的异同点:
                相同点:都需要创建产品(电影)接口或抽象类、具体产品(电影)对象类。
                不同点: 
                        简单工厂,把产品对象的创建的工作封装在一类的方法中。
                        工厂方法,定义好创建产品对象的接口,由子类具体的产品对象的创建工作。
                         形象说,简单工厂允许一个工厂(方法)造产品,工厂方法允许不同的工厂(子类)都造产品。
  
【实现类图】

原创粉丝点击