意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的 实例化延迟到其子类。
例子
准备了动物的父类和基本的叫声sing
和可以唱歌的方式show
。public abstract class Animal {
protected String sing;
public Animal(String sing) {
this.sing = sing;
}
// 抽象方法,用于子类使用
public abstract void show();
}
简单的小狗:public class Dog extends Animal {
public Dog(String sing) {
super(sing);
}
@Override
public void show() {
System.out.pringln("dog:"+sing);
}
}
简单的小猫:public class Cat extends Animal {
public Cat(String sing) {
super(sing);
}
@Override
public void show() {
System.out.pringln("cat:"+sing);
}
}
当然了,甚至更多…
这样我们可以尝试让他们出来活动一下:public class Garden {
public static void main(String[] arg) {
Animal cat = new Cat("miao~");
cat.show();
Animal dog = new Dog("wang!");
dog.show();
}
}
很基础的功能,但是貌似很多重复的代码,当这个逻辑更复杂的时候,重复的代码只会更多。
现在来试试工厂开发:public class SimpleFactory {
public Animal create(String type, String sing) {
Animal animal = null;
switch(type) {
case "Dog":
animal = new Dog(sing);
break;
case "Cat":
animal = new Cat(sing);
break;
}
return animal;
}
}
试用一下:public class Garden {
public static void main(String[] arg) {
SimpleFactory factory = new SimpleFactory();
factory.create("Dog").show();
factory.create("Cat").show();
}
}
此时这里是一个简单的逻辑优化,如果需要成为设计模式,需要抽象。public interface Factory {
public Animal create(String type, String sing);
}
这就是抽象出来的工厂方法。可以让其他工厂来构建类似的功能。是代理者这一信息局部化的时候
适用性
- 当一个类不知道他所必须创建的对象的类的时候
- 当一个类希望由他的子类来指定他所创建的对象的时候
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类
结构
协作
Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。
效果
工厂方法不再将与特定应用有关的类绑定到你的代码中。代码仅处理Product接 口 ; 因此它可以与用户定义的任何ConcreteProduct类一起使用 。
工厂方法的一个潜在缺点在于客户可能仅仅为了创建一个特定的ConcreteProduct对象, 就不得不创建Creator的子类。当Creator子类不必需时,客户现在必然要处理类演化的其他方面;但是当客户无论如何必须创建Creator的子类时,创建子类也是可行的 。