浅析设计模式之八 工厂模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析设计模式之八 工厂模式相关的知识,希望对你有一定的参考价值。

工厂模式被传的太多(有点烂大街的味道)我也就不贴代码了 
简单工厂模式
        不是设计模式,更像是一种编程习惯 
    设计模式中,所谓"实现一个接口"并"不一定"表示写一个类,implements某个Java接口
    "实现一个 接口"泛指"实现某个超类型(可以是接口 或者接口 某个方法)"
 
    所有的工厂模式用来封装对象的创建
    工厂方法模式(Factory Method Pattern)通过让子类决定该创建的对象是什么
   
 组成元素:
        创建者类(creator)
        产品类
        这个种类是层级平等的类,因为他们有各自的抽象类,有具体的子类是具体的实现方法
 
工厂方法模式:
        定义了一个创建对象的接口.但是由子类决定要实例化的类是哪一个
        工厂方法让类把实例化推迟到子类
 
设计原则:
       要依赖抽象,不要依赖具体实现类 
        不能让高层组件依赖底层组件,而且不管哪层,都要依赖抽象 ==>依赖倒置原则
        所谓高层组件,就是由其他底层定义其行为的类
        如案例中,pizzastore是高层组件,他的行为是pizza定义的:pizzastore创建所有不同的pizza,以及pizza的加工  而pizza本身属于底层组件
 
 
抽象工厂模式
        提供一个接口用来创建相关或依赖对象的家族,而不需要明确指出具体类
        抽象工厂允许客户使用抽象接口来创建一组相关产品,而不需要关心实际产出具体是什么
    
        抽象工厂的方法经常以工厂方法的方式实现
        抽象工厂的任务是定义一个负责创建一组产品的接口
        这个接口内的每一个方法都负责创建一个具体产品,
        同时我们利用实现抽象工厂的子类提供这些具体的做法
        所以在抽象工厂中利用工厂方法实现生产方法是相当自然的事
 
 
 
 
 
简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
不修改代码的话,是无法扩展的。
技术分享
 
工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。
在同一等级结构中,支持增加任意产品。
技术分享

 

 
抽象工厂
 
抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
 技术分享
小结
 
工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。
★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。
工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。
 
区别
 
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。 (支持增加任意产品)   
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)  
 
抽象工厂工厂方法异同点
    同:
        解耦
        创建对象
        集合相关产品
    异:
        工厂方法    
                继承 
                    ==> 创建对象,需要扩展一个类,并覆盖他的方法,利用子类创建对象
                    ==> 客户只需知道所使用的抽象类型,由子类负责决定具体类型
                创建一个产品
                将代码中需实例化的具体类解耦
        抽象工厂
                组合
                    ==> 提供创建一个产品家族的抽象类型,这个类型的子类定义了产品被生产的方法
                    ==> 使用这个工厂,需要先实例化,将其然后将他传入一些针对抽象类型所特写的方法
                创建产品家族,集合相关产品
 
 
依赖倒置原则指导方针:
    变量不可持有具体类的的引用         ==>     如果使用new,就会持有具体类的引用,可以改用工厂来避开他
    不要让类派生自具体类                    ==>     如果派生自具体类,你就会依赖具体类;要派生自一个抽象(接口或者抽象类)
    不要覆盖基类中已实现的方法        ==>      如果覆盖,这个基本就不再是适合被继承的基类    ; 基类中实现的方法应该被子类共享
 
 
 
 
 



以上是关于浅析设计模式之八 工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式——工厂模式浅析

浅析JAVA设计模式之工厂模式

浅析设计模式——创建型模式之Abstract-Factory(抽象工厂模式)

浅析设计模式1 —— 工厂模式

浅析设计模式1 —— 工厂模式

浅析设计模式——创建型模式之simple-factory(简单工厂方法,非设计模式)