抽象工厂模式

来源:互联网 发布:淘宝天猫美工 编辑:程序博客网 时间:2024/06/05 17:11

抽象工厂模式(Abstract Factory)

在看抽象工厂模式之前,希望大家先去看一下我另一篇博客:

工厂方法模式

在了解了工厂方法模式之后,我们会发现一个问题,类的创建会依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?

我们试着看看抽象工厂模式。

抽象工厂模式:就是创建多个工厂类,这样一但需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

接下来我们看代码来理解。

我们以Animal接口,Dog类,Cat类为例,看一下继承关系。

Animal.Java代码:

public interface Animal {public void play();}


Dog.java代码:

public class Dog implements Animal{      @Override      public void play() {          System.out.println("I am a dog!");      }     }  

 Cat.java代码:

public class Cat implements Animal{      @Override      public void play() {          System.out.println("I am a cat!");      }  } 

Animal为所有动物类的父接口,在接口中定义了统一的抽象方法 play(); ,动物子类复用这个抽象方法并实现细节。

Dog类继承了Animal接口,并实现了接口中的抽象方法play();。
Cat类继承了Animal接口,并实现了接口中的抽象方法play();。


接下来我们再来写一个工厂接口。

AnimalFactory.java代码:

public interface AnimalFactory {public Animal produce();}


记住我们抽象工厂模式是要创建多个工厂类的。

所以我们要分别为Dog类和Cat类创建工厂类。

DogFactory.java代码:

public class DogFactory implements AnimalFactory{@Overridepublic Animal produce() {return new Dog();}}
CatFactory.java代码:
public class CatFactory implements AnimalFactory{@Overridepublic Animal produce() {return new Cat();}}

最后我们写一个测试类来测试一下。

AnimalTest.java代码:

public class AnimalTest {public static void main(){AnimalFactory animalFactory = new DogFactory();Animal dog = animalFactory.produce();dog.play();} }

控制台输出结果如下:

I am a dog!

可以看到我们为AnimalFactory接口创建了一个DogFactory的子类实现,然后调用它的produce();方法返回一个Dog类对象,把Dog类对象交给Animal接口,再使用它的play();方法在控制台输出结果。

其实这个模式的好处就是,如果你现在想增加一个功能:比如在增加一个动物鱼,则只需增加一个Fish实现类,实现Animal接口,同时做一个FishFactory工厂类,实现AnimalFactory接口,就OK了,无需去改动现成的代码。这样做,能够更好的拓展。


原创粉丝点击