橘生淮南则为橘,橘生淮北则为枳

工厂方法模式(Factory Method Pattern)


关于产品(Product)

  • AbstractProduct-抽象产品

  • ConcreteProductA-具体产品A

  • ConcreteProductB-具体产品B


关于工厂(Factory or Creator):

  • AbstractFactory-抽象工厂

  • ConcreteFactoryA-具体工厂A

  • ConcreteFactoryB-具体工厂B



------------
随便举个例子,套用一句古语,牵强的很……

抽象产品:橘子(Orange)
具体产品:普通橘子(Mandarin Orange),枳子(Funny Orange)

抽象工厂:土地(Soil)
具体工厂:淮南土地(HuaiNan Soil),淮北土地(HuaiBei Soil)

1# Orange.java

public abstract class Orange {

  protected String taste;

  protected String name;

  public String getTaste() {
    return taste;
  }

  public String getName() {
    return name;
  }

}

2# MandarinOrange.java

public class MandarinOrange extends Orange {

  public MandarinOrange() {
    this.name = "Mandarin Orange";
    this.taste = "delicious";
  }

}

3# FunnyOrange.java

public class FunnyOrange extends Orange {
  public FunnyOrange() {
    this.name = "Funny Orange";
    this.taste = "funny";
  }
}

---------

4# Soil.java

public abstract class Soil {

  abstract public Orange harvestOrange();

  public void printInvolvedParameter() {
    Orange org = this.harvestOrange();
    System.out.println("Species:" + org.getName());
    System.out.println("Tastes:" + org.getTaste());
  }

}

5# HuaiNanSoil.java

public class HuaiNanSoil extends Soil {

  @Override
  public Orange harvestOrange() {

    return new MandarinOrange();
  }

}

6# HuaiBeiSoil.java

public class HuaiBeiSoil extends Soil {

  @Override
  public Orange harvestOrange() {

    return new FunnyOrange();
  }

}

---------
7# TestFactoryMethodPattern

public class TestFactoryMethodPattern {

  public static void main(String[] args) {

    Soil soil = new HuaiNanSoil();
    soil.printInvolvedParameter();

    System.out.println("----------");

    soil = new HuaiBeiSoil();
    soil.printInvolvedParameter();

  }

}

--------
测试结果

Species:Mandarin Orange
Tastes:delicious
----------
Species:Funny Orange
Tastes:funny
标签: | edit post
0 Responses