• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

宏天工作室

尘封在心中的财富!
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

设计模式(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  把客户代码从需要实例化的具体类中解耦。或者如果目前还不知道将来需要实例化那些具体类,使用工厂方法模式

posted on 2011-06-24 15:21  zjp  阅读(302)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3