简单工厂模式的引进
水果接口规定出所有的水果必须实现的接口,包括任何水果类必须具备的方法:种植plant(),生长grow(),收获harvest().如下图:
水果接口源代码:
/** * 水果 * @author Administrator * */ public interface Fruit { //生长 void grow(); //种植 void plant(); //收获 void harvest(); }
苹果类的源代码:
/** * 苹果 * @author Administrator * */ public class Apple implements Fruit{ private int treeAge; public int getTreeAge() { return treeAge; } public void setTreeAge(int treeAge) { this.treeAge = treeAge; } @Override public void grow() { System.out.println("Apple grow ..."); } @Override public void plant() { System.out.println("Apple plant ..."); } @Override public void harvest() { System.out.println("Apple harvest ..."); } }
葡萄类的源代码:
/** * 葡萄 * @author Administrator * */ public class Grape implements Fruit { //是否有籽 private boolean seedless; public boolean isSeedless() { return seedless; } public void setSeedless(boolean seedless) { this.seedless = seedless; } @Override public void grow() { System.out.println("Grape grow ..."); } @Override public void plant() { System.out.println("Grape plant ..."); } @Override public void harvest() { System.out.println("Grape harvest ..."); } }
草莓类的源代码:
/** * 草莓 * @author Administrator * */ public class Strawberry implements Fruit { @Override public void grow() { System.out.println("Strawberry grow ..."); } @Override public void plant() { System.out.println("Strawberry plant ..."); } @Override public void harvest() { System.out.println("Strawberry harvest ..."); } }
园丁类的源代码:
public class FruitGardener { /** * 静态工厂方法 * @param which * @return */ public static Fruit factory(String which){ if(which.equalsIgnoreCase("apple")){ return new Apple(); } else if(which.equalsIgnoreCase("grape")){ return new Grape(); } else if(which.equalsIgnoreCase("strawberry")){ return new Strawberry(); }else{ return null; } } public static void main(String[] args) { FruitGardener.factory("apple").grow(); FruitGardener.factory("grape").plant(); FruitGardener.factory("strawberry").harvest(); } }
简单工厂模式的结构:
简单工厂根据传入的参量决定创建哪一类的产品的实例,如下图:
简单工厂模式涉及到工厂角色,抽象产品角色以及具体产品角色等三类角色:
1)工厂类角色(Creator)
2)抽象产品角色(Product)
3)具体产品角色(ConcreteProduct)
简单工厂模式在Java中的运用:
DateFormat与简单工厂模式:
1)DateFormat本身是一个抽象类,但是它提供很多静态工厂方法,
public final static DateFormat getTimeInstance(); public final static DateFormat getTimeInstance(int style); public final static DateFormat getTimeInstance(int style,Locale aLocale); .....
2)getTimeInstance并没有直接调用调用DateFormat的构造方法,而是返回DateFormat的具体子类SimpleDateFormat,而getTimeInstance方法返回SimpleDateFormat的实例,并且仅它声明为DateFormat类型,这就是纯正的多态性原则的运用。