设计模式-工厂方法

  1. 意图
  2. 例子
  3. 适用性
  4. 结构
  5. 协作
  6. 效果

意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。 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);
}

这就是抽象出来的工厂方法。可以让其他工厂来构建类似的功能。是代理者这一信息局部化的时候

适用性

  1. 当一个类不知道他所必须创建的对象的类的时候
  2. 当一个类希望由他的子类来指定他所创建的对象的时候
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类

结构

github

协作

Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。

效果

工厂方法不再将与特定应用有关的类绑定到你的代码中。代码仅处理Product接 口 ; 因此它可以与用户定义的任何ConcreteProduct类一起使用 。
工厂方法的一个潜在缺点在于客户可能仅仅为了创建一个特定的ConcreteProduct对象, 就不得不创建Creator的子类。当Creator子类不必需时,客户现在必然要处理类演化的其他方面;但是当客户无论如何必须创建Creator的子类时,创建子类也是可行的 。