设计模式(5)-工厂模式(Factory)创建型
要点
l 所有工厂都用于封住对象的创建
l 简单工厂虽然不是真正的设计模式,但仍不失为一个简单地方法,可以将客户程序从具体类解耦
l 工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法的创建对象
l 抽象工厂使用对象组合,对象的创建被实现在工厂接口所暴露出来的方法中
l 所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合
l 工厂方法允许类将实例化延迟到子类中
l 抽象工厂创建相关的对象家族而不需依赖它们具体的类
l 依赖倒置原则,指导我们避免依赖具体类型而要尽量依赖抽象
l 工厂是很有威力的技巧,帮助我们针对抽象编程,而不要针对具体类编程
简单工厂
简单工厂不是一个设计模式,比较像一个编程习惯,不要因为简单工厂不是“真正的”模式,而忽略其用法。
简单工厂类图
说明:创建了一个抽象的SimplePizzaFactory类作为工厂。比萨店PizzaStore通过工厂取得比萨实例。Pizza作为比萨店的产品用作各种比萨的抽象超类,而各种不同品种的比萨作为Pizza的子类,同时具体实现Pizza的方法。
工厂方法模式(Factory Method)
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
l 所有工厂模式都用来封装对象的创建。
l 工厂方法模式(Factory Method Pattern)通过让子类决定改创建对象是什么,来达到将对象创建的过程封装的目的。
工厂方法模式的重要功能
l 定义创建对象的接口,封装了对象的创建。
l 使得具体化类的工作延迟到子类中
工厂方法模式的两种情况类图
1. 定义创建对象的接口,封装了对象的创建
2. 使得具体化类的工作延迟到子类中
依赖倒置原则
和一般OO设计思考方式完全想法,底层不见依赖于高层部件,高层部件依赖相同的抽象。
要依赖抽象,不要依赖具体类。
遵循此原则的方针
l 变量不可以持有具体类的引用,
l 不要让类派生自具体类。
l 不要覆盖具体类中已实现的方法
工厂方法模式带来的问题
l 如果为每个ConcreteProduct类的实例化提供一个函数体。那么就不得不在系统中添加一个方法来处理这个新建的ConcreteProduct,这样Factory接口永远不能封闭。
l 在实现中可以通过参数化工厂方法,即给FactoryMethod()传递一个参数用以决定是创建具体哪一个具体的Product。当然也可以通过模块化避免子类创建子类,方法就是将具体Product类作为末班参数,实现起来也简单。
l Factory模式对于对象的创建给与开发人员提供了很好的实现策略,但是,Factory模式仅限于一类类,(Product是一类,有一个共同的基类),如果要为不同类提供一个对象创建的接口,要使用抽象工厂模式(AbstractFactory)
抽象工厂模式(Abstract Factory)
提供一个接口,用于创建相关或依赖的对象家族,而不需要明确指定具体类。
抽象工厂模式类图
工厂方法模式与抽象工厂模式比较
抽象工厂模式:
l 为创建一组(有多类)相关或依赖的对象提供创建接口
l 通过对象的组合实现
l 使用对象
l 提供一个用来创建一个家族的抽象类型,这个类型的子类定义了产品被产生的方法。要想使用这个工厂,必须先实例化它,然后将它传入一些针对抽象类型所写的代码中
l 抽象工厂中的具体工厂经常通过实现工厂方法来创建产品,
l 需要创建产品家族和想让制造的相关产品集中起来时,使用抽象工厂
工厂方法模式:
l 为一类对象提供创建接口或延迟对象的实现到子类
l 通过类的继承
l 使用类
l 通过子类创建对象,客户之需要知道他们所使用的抽象类型,而又子类来负责决定具体类型。
l 把客户代码从需要实例化的具体类中解耦。或者如果目前还不知道将来需要实例化那些具体类,使用工厂方法模式