`
yangshen998
  • 浏览: 1246791 次
文章分类
社区版块
存档分类
最新评论

java 设计模式 学习笔记 (2) - 工厂方法模式

 
阅读更多

工厂方法模式: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。


具体实现方式如下:

1. 建立一个 Animal 抽象类 ,该类有一个 shout() 方法,打印出 调用shout 方法的对象类。

为什么要建立一个Animal抽象类?

答: 声明为抽象的作用就是为了表示 Animal 是不能实例化的,要实例化就去实例化猫狗之类的具体动物。

为什么非要一个Animal 抽象类,而不直接写一个 Bear 类,并让Bear 类包含 shout () 方法?

答: 这是为了后面实例化某种动物时使用多态,也就是说虽然声明了 Animal ,但只要我指定了用Bear 工厂创建 Bear 对象,那 么就返回一个Bear 对象。

并且父类中声明了一个 shout () 方法,那么所有子类想实现同样功能时,就不要重新写一个相同的方法。这样也减少了代 码的重复性


上一篇博客中的Animal 类也应该修改成 abstract

2. 建立一个 Bear 类,该类继承了 Animal 。

3. 建立一个 Cat 类,该类继承了 Animal。

4. 建立工厂接口IAnimalFactory,该接口有一个创建动物 的方法 : createAnimal();

为什么直接使用 BearFactory 工厂来创建 Bear 对象,而需要使用一个 动物工厂接口?

答: 使用接口的好处有隐藏实现,利于多态,减少代码耦合性等等

在这里,使用接口可以看到的好处是在测试类中,如果我想生成一个Cat 对象,那么就将BearFactory 改成 CatFactory,其他地 方的代码不用改。 当然在这个修改的过程中就体现出工厂方法的特点: 让动物工厂类来决定这个动物工厂该生产那种动物,并且生 产这种动物的过程也是在动物工厂类中完成的。

5. 如果需要一个生产 Bear 类的工厂, 则新建一个 BearFactory 类,该类实现了 IAnimalFactory,并必须实现createAnimal ()方法,重写后的createAnimal() 方法返回一个 Bear 类的实例

6.如果需要一个生产 Cat 类的工厂, 则新建一个 CatFactory 类,该类实现了 IAnimalFactory,并必须实现createAnimal ()方法,重写后的createAnimal() 方法返回一个 Bear 类的实例

7. 建立一个TestFactoryMethod 类,该类用来检验工厂方法代码的正确性。

8. 结果验证


在这里就讨论下简单工厂模式和工厂方法模式的异同点:

最重要的相同点 : 都是用了多态技术,声明了一个 Animal 父类, 工厂返回的是 Cat/Bear 等子类

不同之处 : 简单工厂在一个工厂中可以制造多中 子类, 而工厂方法则是某一个具体的工厂只能创建某一种子类,也就是子类决定实例化 哪一个类。

如果在简单工厂中需要增加创建Tigger 类,那么必须在 AnimalFactory 类的 Switch 语句中再增加一个

case 't' : animal = new Tigger();

这样就严重违反了软件重构的一个重要原则: 添加功能时,尽量避免在原来的代码上改,而应该通过继承或实现接口的方式来 扩展原有功能。而工厂方法正好符合了这一点,只需要新建一个 Tigger 类 和 新建一个TiggerFactory 来实现 IAnimalFactory 接口,并重写createAnimal() 方法使其返回 Tigger 对象。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics