抽象工厂

来源:互联网 发布:中位数快速选择算法 编辑:程序博客网 时间:2024/06/05 18:51

抽象工厂

早就久闻抽象工厂的大名,以前查阅过很多资料,烦烦索索讲的很多,搞得人头晕脑胀,今天自己总结了一下。有什么不对希望指出。


抽象工厂的好处就是,新加的功能不需要对原有的代码进行改动,可以提升程序的可维护性。

先看如下代码:

package b811.action;//先生成一个动作接口,这里以"吃"的动作为例public interface Eat {    //提供一个动作(吃)的接口,让别人去实现吃什么    void eat();}

接下来我们给Eat接口写出两个实现类。
1.

package b811.action.impl;import b811.action.Eat;public class EatApple implements Eat {    //吃苹果    @Override    public void eat() {        System.out.println("eat apple");    }}

2.

package b811.action.impl;import b811.action.Eat;public class EatPear implements Eat {    //吃梨    @Override    public void eat() {        System.out.println("eat pear");    }}

紧接着,我们写一个provider来控制工厂

package b811.action.provider;import b811.action.Eat;    //通过provider来控制工厂public interface EatProvider {    Eat action();}

然后开始生成我们的动作工厂来实现provider
吃苹果的

package b811.factory;import b811.action.Eat;import b811.action.impl.EatApple;import b811.action.provider.EatProvider;public class EatAppleFactory implements EatProvider {    //创建吃苹果的工厂    @Override    public Eat action() {        return new EatApple();    }}

吃梨的

package b811.factory;import b811.action.Eat;import b811.action.impl.EatPear;import b811.action.provider.EatProvider;public class EatPearFactory implements EatProvider {    //创建吃梨的工厂    @Override    public Eat action() {        return new EatPear();    }}

最后我们来测试一下

package b811.test;import b811.action.provider.EatProvider;import b811.factory.EatAppleFactory;public class Test {public static void main(String[] args) {    //创建吃苹果的工厂    EatProvider provider = new EatAppleFactory();    //执行吃的动作    provider.action().eat();}}

好了,抽象工厂这样基本就完成了。接下来我们继续来看它是怎么不需要修改原有的代码添加新的功能。

现在又来了一大堆香蕉需要我们吃,那么很简单。
首先我们需要为Eat写一个实现类。

package b811.action.impl;import b811.action.Eat;public class EatBanana implements Eat {    //吃香蕉    @Override    public void eat() {        System.out.println("eat banana!");    }}

然后我们为吃香蕉的动作产生一个工厂。写一个provider的实现类

package b811.factory;import b811.action.Eat;import b811.action.impl.EatBanana;import b811.action.provider.EatProvider;public class EatBananaFactory implements EatProvider {    //创建香蕉的工厂    @Override    public Eat action() {        return new EatBanana();    }}

最后我们来测试一下刚才吃香蕉的动作

package b811.test;import b811.action.provider.EatProvider;import b811.factory.EatAppleFactory;import b811.factory.EatBananaFactory;public class Test {public static void main(String[] args) {    //创建吃香蕉的工厂    EatProvider provider2 = new EatBananaFactory();    //执行动作    provider2.action().eat();}}

执行结果

eat banana!

完全没有修改我们之前写过的代码实现了自己的附加功能。

0 0