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

本文详细介绍工厂方法模式的设计理念与实现步骤,包括抽象类Animal及其实现类Bear和Cat的定义,通过IAnimalFactory接口和具体工厂如BearFactory、CatFactory实现多态特性,最后通过示例验证了模式的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


具体实现方式如下:

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

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

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

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

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

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


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

/** * 这是一个动物类,有一个所有动物都有的方法 shout * @author liaogang.pt */ public class Animal { public void shout(){ System.out.println("you create a :"+this.getClass().getName()); } }

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

/** * 这是一个熊类,简单起见,它继承了 Animal 类,同时也就继承了shout 方法 * @author liaogang.pt * */ public class Bear extends Animal{ }

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

/** * 这是一个猫类,简单起见,它继承了 Animal 类,同时也就继承了shout 方法 * @author liaogang.pt */ public class Cat extends Animal{ }

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

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

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

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

interface IAnimalFactory { Animal createAnimal(); }

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

public class BearFactory implements IAnimalFactory{ @Override public Animal createAnimal() { // TODO Auto-generated method stub return new Bear(); } }

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

public class CatFactory implements IAnimalFactory{ @Override public Animal createAnimal() { // TODO Auto-generated method stub return new Cat(); } }

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

public class TestFactoryMethod { public static void main(String[] args){ IAnimalFactory iAnimalFactory=new BearFactory(); Animal animal = iAnimalFactory.createAnimal(); animal.shout(); IAnimalFactory iAnimalFactory2=new CatFactory(); Animal animal2 = iAnimalFactory2.createAnimal(); animal2.shout(); }

8. 结果验证

you create a :Bear you create a :Cat


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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值