对工厂方法模式学习的笔记

工厂方法模式

         工厂模式不在工厂中产生具体的对象实例,而是在子类中进行实例化工作。工厂方法模式的主要关系是“工厂-- 产品”之间的关系,工厂和产品,首先进行抽象化,例如抽象为生产刀具的工厂和刀具,这两者皆为抽象的对象,抽象的工厂与产品之间,使用接口作为联系的纽带,这样可以添加系统的可拓展性以及可维护性。

引用学习书中的一张图来说明该模式的结构

抽象工厂生产抽象产品;具体工厂生产具体产品;

        抽象实现为具体。

通过实现抽象工厂的接口,可以在不影响其他已经实现接口的情况下对工厂进行拓展,利用了面向对象的多态性。

         使用场合:

1. 子类型很多,并且需要不断添加不同子类型时;

2. 系统处于框架设计阶段,还不知道需要实例化那些具体类时;

3.  系统设计初不需要具体对象的概念。

开闭原则的应用:

         开闭原则主要是指软件系统实体对扩展开放,对修改关闭。主要就是在设计一个模块的时候,可以在不被修改的情况下进行扩展。

         具体的产品由具体的工厂生产,其实就是将抽象的工厂和产品进行具体的实例化,之后由具体的工厂生产具体的产品。当然,假如我想生产新的产品呢?

这时候可以有2种方式,第一个是,建立新的工厂,建立新的生产线,然后生产新的产品;第二个就是用老的工厂,更换产品线,生产新的产品。这2种方法,都没有修改任何父类工厂中的代码,他们的实现过程都是在子类中进行处理的,因此,保证了软件系统的稳定性。

面向抽象层编程的应用:

         如上面说的开闭原则的例子中,假如我们直接采用在父类工厂中就定义了产品的生产方式,那么,假如我们想更换新的产品,并且新产品和老产品差别很大时,我们就需要对父类工厂进行很大的修改,增加了软件开发和维护的成本。

假如我们按照工厂模式进行设计,在子类中实现实现具体的工厂和具体的产品,那么我们想更换产品的时候,只要生产的新产品依然遵循父类的抽象,这时候只需要对建立一个新的子类进行实现即可,哪怕新的产品细节上与其他产品有很多不同,也不会对父类抽象造成任何影响,这样就无需对父类进行改动,提高了模块的稳定性。

 

抽象工厂模式

         抽象工厂模式和工厂方法模式类似,但是抽象工厂模式最大的区别在于抽象工厂模式的工厂可以可以创建多种产品,而工厂方法模式只能创建一种产品。

         抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。

使用场合

         1.创建产品家族,相关产品集合在一起使用。

         2.想要提供一个产品类库,并只想显示其接口而不是实现。

         3.通过组合的方式使用工厂时。

两者区别

引用网上看到一个结论:

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。  

              一个抽象工厂类,可以派生出多个具体工厂类。  

              每个具体工厂类只能创建一个具体产品类的实例。  

抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。  

              一个抽象工厂类,可以派生出多个具体工厂类。  

              每个具体工厂类可以创建多个具体产品类的实例。


引用一篇对工厂方法模式和抽象工厂模式说的很简明的博客

http://laughingchs.iteye.com/blog/1169986



额外学习到的

额外学习到的一点,对于“多用对象组合,少用继承”的设计原则,其特征主要是在A类中,建立其他类的变量,在A类的构造函数或者set方法中,将实例化的类赋值给这些其他类变量。从而达到对象的组合。这样的原则,可以使得系统结构更加具有灵活性,同时,也降低了继承中基类对子类的巨大影响。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值