"Simple Factory" vs "Factory Method" vs "Abstract Factory" vs "Reflect", abstractreflect
Ref: http://www.cnblogs.com/zhangchenliang/p/3700820.html
1. "Simple Factory"
package torv.abc;public class HelloMain { public static void main(String[] args) { Driver.createCar("audi").drive(); }}//====================================================== product carabstract class Car { private String brand; public abstract void drive(); public String getBrand() { return brand; } public void setBrand(String brandName) { brand = brandName; }}//------------------------------------------------benzclass BenzCar extends Car { public BenzCar() { setBrand("Benz"); } @Override public void drive() { System.out.println(getBrand() + "--go-----"); }}//------------------------------------------------bmwclass BmwCar extends Car { public BmwCar() { setBrand("Bmw"); } @Override public void drive() { System.out.println(getBrand() + "--go-----"); }}//------------------------------------------------audiclass AudiCar extends Car { public AudiCar() { setBrand("Audi"); } @Override public void drive() { System.out.println(getBrand() + "--go-----"); }}//====================================================== factoryclass Driver { public static Car createCar(String carName) { Car car = null; if (carName.equalsIgnoreCase("benz")) { car = new BenzCar(); } else if (carName.equalsIgnoreCase("bmw")) { car = new BmwCar(); } else if (carName.equalsIgnoreCase("audi")) { car = new AudiCar(); } return car; }}
2. "Factory Method"
package torv.abc;public class HelloMain { public static void main(String[] args) { Driver driver = new BmwDriver(); driver.createCar().drive(); }}//====================================================== product carabstract class Car { private String brand; public abstract void drive(); public String getBrand() { return brand; } public void setBrand(String brandName) { brand = brandName; }}//------------------------------------------------benzclass BenzCar extends Car { public BenzCar() { setBrand("Benz"); } @Override public void drive() { System.out.println(getBrand()+"--go-----"); }}//------------------------------------------------bmwclass BmwCar extends Car { public BmwCar() { setBrand("Bmw"); } @Override public void drive() { System.out.println(getBrand()+"--go-----"); }}//------------------------------------------------audiclass AudiCar extends Car { public AudiCar() { setBrand("Audi"); } @Override public void drive() { System.out.println(getBrand()+"--go-----"); }}//====================================================== factoryabstract class Driver { public abstract Car createCar();}class BenzDriver extends Driver{ @Override public Car createCar() { return new BenzCar(); } }class BmwDriver extends Driver{ @Override public Car createCar() { return new BmwCar(); } }class AudiDriver extends Driver{ @Override public Car createCar() { return new AudiCar(); } }
3. "Abstract Factory"
package torv.abc;public class HelloMain { public static void main(String[] args) { Driver driver = new SportDriver(); driver.createAudiCar().drive(); }}//====================================================== product carabstract class Car { private String brand; private String kind; public abstract void drive(); public String getBrand() { return brand; } public void setBrand(String brandName) { brand = brandName; } public String getKind() { return kind; } public void setKind(String kindName) { kind = kindName; }}//------------------------------------------------benzabstract class BenzCar extends Car { public BenzCar() { setBrand("Benz"); }}class BenzSportCar extends BenzCar { public BenzSportCar() { setKind("Sport"); } @Override public void drive() { System.out.println(getBrand() + "--" + getKind() + "--go-------"); }}class BenzBizCar extends BenzCar { public BenzBizCar() { setKind("Biz"); } @Override public void drive() { System.out.println(getBrand() + "--" + getKind() + "--go-------"); }}//------------------------------------------------bmwabstract class BmwCar extends Car { public BmwCar() { setBrand("Bmw"); }}class BmwSportCar extends BmwCar { public BmwSportCar() { setKind("Sport"); } @Override public void drive() { System.out.println(getBrand() + "--" + getKind() + "--go-------"); }}class BmwBizCar extends BmwCar { public BmwBizCar() { setKind("Biz"); } @Override public void drive() { System.out.println(getBrand() + "--" + getKind() + "--go-------"); }}//------------------------------------------------audiabstract class AudiCar extends Car { public AudiCar() { setBrand("Audi"); }}class AudiSportCar extends AudiCar { public AudiSportCar() { setKind("Sport"); } @Override public void drive() { System.out.println(getBrand() + "--" + getKind() + "--go-------"); }}class AudiBizCar extends AudiCar { public AudiBizCar() { setKind("Biz"); } @Override public void drive() { System.out.println(getBrand() + "--" + getKind() + "--go-------"); }}//====================================================== factoryabstract class Driver { public abstract Car createBenzCar(); public abstract Car createBmwCar(); public abstract Car createAudiCar();}class SportDriver extends Driver { @Override public Car createBenzCar() { return new BenzSportCar(); } @Override public Car createBmwCar() { return new BmwSportCar(); } @Override public Car createAudiCar() { return new AudiSportCar(); }}class BizDriver extends Driver { @Override public Car createBenzCar() { return new BenzBizCar(); } @Override public Car createBmwCar() { return new BmwBizCar(); } @Override public Car createAudiCar() { return new AudiBizCar(); }}
3. "Simple Factory" + Reflect
package torv.abc;public class HelloMain { public static void main(String[] args) { try { Driver.createCar("torv.abc.BenzSportCar").drive(); } catch (Exception e) { e.printStackTrace(); } }}//====================================================== product carabstract class Car { private String brand; private String kind; public abstract void drive(); public String getBrand() { return brand; } public void setBrand(String brandName) { brand = brandName; } public String getKind() { return kind; } public void setKind(String kindName) { kind = kindName; }}//------------------------------------------------benzabstract class BenzCar extends Car { public BenzCar() { setBrand("Benz"); }}class BenzSportCar extends BenzCar { public BenzSportCar() { setKind("Sport"); } @Override public void drive() { System.out.println(getBrand() + "--" + getKind() + "--go-------"); }}class BenzBizCar extends BenzCar { public BenzBizCar() { setKind("Biz"); } @Override public void drive() { System.out.println(getBrand() + "--" + getKind() + "--go-------"); }}//------------------------------------------------bmwabstract class BmwCar extends Car { public BmwCar() { setBrand("Bmw"); }}class BmwSportCar extends BmwCar { public BmwSportCar() { setKind("Sport"); } @Override public void drive() { System.out.println(getBrand() + "--" + getKind() + "--go-------"); }}class BmwBizCar extends BmwCar { public BmwBizCar() { setKind("Biz"); } @Override public void drive() { System.out.println(getBrand() + "--" + getKind() + "--go-------"); }}//------------------------------------------------audiabstract class AudiCar extends Car { public AudiCar() { setBrand("Audi"); }}class AudiSportCar extends AudiCar { public AudiSportCar() { setKind("Sport"); } @Override public void drive() { System.out.println(getBrand() + "--" + getKind() + "--go-------"); }}class AudiBizCar extends AudiCar { public AudiBizCar() { setKind("Biz"); } @Override public void drive() { System.out.println(getBrand() + "--" + getKind() + "--go-------"); }}//====================================================== factoryabstract class Driver { public static Car createCar(String name) throws Exception{ return (Car) Class.forName(name).newInstance(); }}