浅析设计模式之八 工厂模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析设计模式之八 工厂模式相关的知识,希望对你有一定的参考价值。
工厂模式被传的太多(有点烂大街的味道)我也就不贴代码了
简单工厂模式
不是设计模式,更像是一种编程习惯
设计模式中,所谓"实现一个接口"并"不一定"表示写一个类,implements某个Java接口
"实现一个 接口"泛指"实现某个超类型(可以是接口 或者接口 某个方法)"
所有的工厂模式用来封装对象的创建
工厂方法模式(Factory Method Pattern)通过让子类决定该创建的对象是什么
组成元素:
创建者类(creator)
产品类
这个种类是层级平等的类,因为他们有各自的抽象类,有具体的子类是具体的实现方法
工厂方法模式:
定义了一个创建对象的接口.但是由子类决定要实例化的类是哪一个
工厂方法让类把实例化推迟到子类
设计原则:
要依赖抽象,不要依赖具体实现类
不能让高层组件依赖底层组件,而且不管哪层,都要依赖抽象 ==>依赖倒置原则
所谓高层组件,就是由其他底层定义其行为的类
如案例中,pizzastore是高层组件,他的行为是pizza定义的:pizzastore创建所有不同的pizza,以及pizza的加工 而pizza本身属于底层组件
抽象工厂模式
提供一个接口用来创建相关或依赖对象的家族,而不需要明确指出具体类
抽象工厂允许客户使用抽象接口来创建一组相关产品,而不需要关心实际产出具体是什么
抽象工厂的方法经常以工厂方法的方式实现
抽象工厂的任务是定义一个负责创建一组产品的接口
这个接口内的每一个方法都负责创建一个具体产品,
同时我们利用实现抽象工厂的子类提供这些具体的做法
所以在抽象工厂中利用工厂方法实现生产方法是相当自然的事
简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
不修改代码的话,是无法扩展的。
工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。
在同一等级结构中,支持增加任意产品。
抽象工厂
抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
小结
★工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。
★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。
★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。
区别
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。 (支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
抽象工厂与工厂方法异同点
同:
解耦
创建对象
集合相关产品
异:
工厂方法
继承
==> 创建对象,需要扩展一个类,并覆盖他的方法,利用子类创建对象
==> 客户只需知道所使用的抽象类型,由子类负责决定具体类型
创建一个产品
将代码中需实例化的具体类解耦
抽象工厂
组合
==> 提供创建一个产品家族的抽象类型,这个类型的子类定义了产品被生产的方法
==> 使用这个工厂,需要先实例化,将其然后将他传入一些针对抽象类型所特写的方法
创建产品家族,集合相关产品
依赖倒置原则指导方针:
变量不可持有具体类的的引用 ==> 如果使用new,就会持有具体类的引用,可以改用工厂来避开他
不要让类派生自具体类 ==> 如果派生自具体类,你就会依赖具体类;要派生自一个抽象(接口或者抽象类)
不要覆盖基类中已实现的方法 ==> 如果覆盖,这个基本就不再是适合被继承的基类 ; 基类中实现的方法应该被子类共享
以上是关于浅析设计模式之八 工厂模式的主要内容,如果未能解决你的问题,请参考以下文章