工厂方法模式

来源:互联网 发布:adobe reader for mac 编辑:程序博客网 时间:2024/06/04 19:48

工厂模式(Factory Method)是23种设计模式之一。

工厂模式又可分为:普通工厂模式,多个工厂方法模式,静态工厂方法模式。

普通工厂模式:就是建立一个工厂类,对实现了统一接口的一些类进行实例的创建。

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

Animal.java代码:

public interface Animal {public void play();}

Dog.java代码:

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

Cat.java代码:

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


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

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

接下来我们写工厂类的代码。

AnimalFactory.java代码:

public class AnimalFactory {public Animal produce(String animal){if(animal.equals("dog")){return new Dog();}else if(animal.equals("cat")){return new Cat();}else{System.out.println("输入的参数有误!");return null;}}}
AnimalFactory类是一个典型的工厂类,用工厂类来返回Animal接口的实例。


我们再写一个AnimalTest类来测试一下。

AnimalTest.java代码:

public class AnimalTest {public static void main(){AnimalFactory animalFactory=new AnimalFactory();Animal dog=animalFactory.produce("dog");dog.play();} }
控制台输出结果如下:

I am a dog!
以上我们可以看出实例化了一个Dog类的对象给接口。

这种普通工厂方法实现了通过工厂类来实例化接口的对象,但是需要我们手动的传人参数,这对有时候我们不知道具体的参数产生了麻烦。

有什么好的方法来解决这个问题嘛?

接下来我们介绍多个工厂方法模式。
多个工厂方法模式:是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,

分别创建对象。

对上面的代码,我们只需要改动AnimalFactory类代码就可以了。
修改后的AnimalFactory.java代码:

public class AnimalFactory {public Animal produceDog(){return new Dog();}public Animal produceCat(){return new Cat();}}
我们再修改一下AnimalTest类来测试一下。

修改后的AnimalTest.java代码:

public class AnimalTest {public static void main(){AnimalFactory animalFactory=new AnimalFactory();Animal cat=animalFactory.produceCat();cat.play();} }

控制台输出结果如下:

I am a cat!

好了,到了这一步,我们来想一下,我们用工厂设计模式就是为了更好的实例化对象,但是我们却忽略了我们的工厂类对象是我们通过new关键字获得的。

会不会觉得很麻烦,不想这样做?

接下来我们介绍静态工厂方法模式。

静态工厂方法模式:将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

我们还是来修改AnimalFactory类。

修改后的AnimalFactory.java代码:

public class AnimalFactory {public static Animal produceDog(){return new Dog();}public static Animal produceCat(){return new Cat();}}

我们再修改一下AnimalTest类来测试一下。

修改后的AnimalTest.java代码:

public class AnimalTest {public static void main(){Animal dog=AnimalFactory.produceDog();dog.play();} }

控制台输出结果如下:

I am a dog!


总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传人的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多情况下,我们会选用第三种——静态工厂方法模式。