设计模式-工厂模式/抽象工厂模式

打印 上一主题 下一主题

主题 1656|帖子 1656|积分 4968

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
工厂模式

界说

        界说一个创建对象的接口,让子类决定实列化哪一个类,工厂模式使一个类的实例化延迟到其子类;


  • 工厂方法模式是简朴工厂模式的延伸。在工厂方法模式中,核心工厂类不在负责产品的创建,而是将具体的创建工作交给子类去完成。也就是后所这个核心工厂仅仅只是提供创建的接口,具体实现方法交给继续它的子类去完成。当我们的体系必要增加其他新的对象时,我们只必要添加一个具体的产品和它的创建工厂即可,不必要对原工厂进行任何修改,这样很好地符合了“开闭原则”。
类图



角色



  • Product :抽象产品。全部的产品必须实现这个共同的接口,这样一来,利用这些产品的类可以引用这个接口,而不是具体类
  • ConcreteProduct :具体产品
  • Creator:抽象工厂,它实现了全部利用产品的方法,但不实现工厂方法。Creator 全部的子类都必须要实现
  • ConcreteCreator:具体工厂。制造产品的现实工厂。它负责创建一个或者多个具体产品,只有ConcreteCreator 类知道怎样创建这些产品。
优缺点



  • 优点:

    • 在工厂方法中,用户只必要知道所要产品的具体工厂,无须关心具体的创建过程,甚至不必要具体产品的类名。
    • 在体系增加新的产品时,我们只必要添加一个具体产品类和对应的实现工厂,无需对工厂进行任何修改,很好的符合了“开闭原则”

  • 缺点:

    • 每次增加一个产品时,都必要增加一个具体类和对象实现工厂,使得体系中类的个数成倍增加,在一定程度上增加了体系的复杂度,同时也增加了体系具体类的依靠。

利用场景



  • 一个类不知道它所必要的对象的类。在工厂方法模式中,我们不必要具体产品的类名,我们只必要知道创建它的具体工厂即可
  • 一个类通过其子类来指定创建谁人对象。在工厂方法模式中,对于抽象工厂类只必要提供一个创建产品的接口,而由其子类来确定具体要创建的对象。在程序运行时,子类对象将覆盖父类对象,从而使得体系更轻易扩展。
  • 将创建对象的使命委托给多个工厂子类中的某一个,客户端在利用时可以无需关系是哪一个工厂子类创建产品子类,必要时再动态指定。
抽象工厂模式

界说

        提供一个创建一系列或相干依靠对象的接口,而无需指定它们具体的类;
类图



角色



  • 抽象工厂角色:描述具体工厂的公共接口,是具体工厂的父类
  • 具体工厂角色:描述具体工厂,创建产品的实例,供外界调用,主要实现了抽象工厂中的抽象方法,完成具体产品的创建
  • 抽象产品角色:抽象产品角色是简朴工厂模式所创建的全部对象的父类,负责描述全部实例所共有的公共接口,它的引入将进步体系的机动性,使得在工厂类中只需界说一个工厂方法,由于全部创建的具体产品对象都是其子类对象。
  • 具体产品角色:具体产品角色是简朴工厂模式的创建目标,全部创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继续了抽象产品角色,必要实现界说在抽象产品中的抽象方法,由具体工厂来创建,它同具体工厂之间逐一对应。
产品族和产品品级



  • 产品族:一个品牌下面的全部产品;例如华为下面的手机,路由器,电脑称为华为产品的产品族
  • 产品品级:多个品牌下面的同种产品;例如华为和小米下面的手机 称为一个产品品级


优缺点



  • 优点

    • 提供了一种封装对象创建过程的方式:抽象工厂模式将对象的创建过程封装在了具体的工厂类中,客户端只必要关注工厂接口和产品接口,而无需关心具体的实现细节。
    • 实现了产品族的切换:通过利用不同的具体工厂类,可以方便的切换整个产品族的产品,从而实现了接口与实现的分离
    • 保持了代码的一致性:抽象工厂模式保持了一致性,即全部由同一工厂创建的产品都相互关联,使得产品之间可以很方便的进行配合利用。

  • 缺点

    • 不易扩展新的产品:当必要给产品家族新增一个产品时,必要修改抽象工厂的接口及全部的具体工厂类,这就违反了开闭原则,增加了代码的维护本钱。
    • 增加了体系的复杂度:抽象工厂模式引入了多个抽象和具体类,增加了体系的复杂度和理解难度。

利用场景



  • 必须创建一系列相互关联或相互依靠的产品对象
  • 必要提供一个同一的接口,将客户端与具体实现解耦
  • 必要在运行时切换不同的产品族
利用案例



  • GUI 工具包:不同的操纵体系(如Windows、Linux)提供了不同的GUI工具包,抽象工厂模式可以用于创建具体的按钮、文本框等GUI组件。
  • 数据库访问:数据库访问框架可以根据设置文件或运行时参数选择不同的数据库访问驱动,抽象工厂模式可以用于创建不同类型的数据库连接和操纵对象。
  • 游戏开辟:在游戏开辟中,可以利用抽象工厂模式来创建不同种类的角色、武器、装备等物品。
要点总结

1. 如果没有应对“多系列 对象构建” 的需求变化,则没有必要利用Abstract Factory 模式,这时间利用简朴工厂完全可以;
2. “系列对象”指的是在某一特定系列下的对象之间有相互依靠,或作用的关系。不同系列的对象之间不能相互依靠。
3. Abstract Factory 模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

汕尾海湾

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表