"Simple Factory" vs "Factory Method" vs "Abstract Factory" vs "Reflect"
2017-07-10 21:24
681 查看
ref: http://www.cnblogs.com/zhangchenliang/p/3700820.html
1. "Simple Factory"
2. "Factory Method"
3. "Abstract Factory"
3. "Simple Factory" + Reflect
1. "Simple Factory"
package torv.abc; public class HelloMain { public static void main(String[] args) { Driver.createCar("audi").drive(); } } //====================================================== product car abstract class Car { private String brand; public abstract void drive(); public String getBrand() { return brand; } public void setBrand(String brandName) { brand = brandName; } } //------------------------------------------------benz class BenzCar extends Car { public BenzCar() { setBrand("Benz"); } @Override public void drive() { System.out.println(getBrand() + "--go-----"); } } //------------------------------------------------bmw class BmwCar extends Car { public BmwCar() { setBrand("Bmw"); } @Override public void drive() { System.out.println(getBrand() + "--go-----"); } } //------------------------------------------------audi class AudiCar extends Car { public AudiCar() { setBrand("Audi"); } @Override public void drive() { System.out.println(getBrand() + "--go-----"); } } //====================================================== factory class 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 car abstract class Car { private String brand; public abstract void drive(); public String getBrand() { return brand; } public void setBrand(String brandName) { brand = brandName; } } //------------------------------------------------benz class BenzCar extends Car { public BenzCar() { setBrand("Benz"); } @Override public void drive() { System.out.println(getBrand()+"--go-----"); } } //------------------------------------------------bmw class BmwCar extends Car { public BmwCar() { setBrand("Bmw"); } @Override public void drive() { System.out.println(getBrand()+"--go-----"); } } //------------------------------------------------audi class AudiCar extends Car { public AudiCar() { setBrand("Audi"); } @Override public void drive() { System.out.println(getBrand()+"--go-----"); } } //====================================================== factory abstract 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 car abstract 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; } } //------------------------------------------------benz abstract 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-------"); } } //------------------------------------------------bmw abstract 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-------"); } } //------------------------------------------------audi abstract 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-------"); } } //====================================================== factory abstract 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 car abstract 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; } } //------------------------------------------------benz abstract 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-------"); } } //------------------------------------------------bmw abstract 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-------"); } } //------------------------------------------------audi abstract 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-------"); } } //====================================================== factory abstract class Driver { public static Car createCar(String name) throws Exception{ return (Car) Class.forName(name).newInstance(); } }
相关文章推荐
- "Simple Factory" vs "Factory Method" vs "Abstract Factory" vs "Reflect"
- Simple Factory Vs Factory Method Vs Abstract Factory by Example
- win7 "ClassFactory cannot supply requested class" in VS 2008的错误解决方法
- 当使用JQuery的"$",抛异常Uncaught TypeError: Object #<Object> has no method 'ajax'
- "VS.NET Web服务器运行的不是ASP.NET 1.1 版"的解决办法
- vs上出现"未能加载项目文件,根级别上的数据无效.Microsoft.WinFx.targets"的解决方法
- vs2013 IntelliSense: "const char *" 类型的实參与 "LPCWSTR" 类型的形參不兼容
- "android linux kernel" VS "standard linux kernel"
- vs2013 IntelliSense: "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容
- <form action="get.php" method="post" id="tform"> <input type="text" name="one"> <a href="jav
- [重构到模式-Simple Factory\Factory Method\Abstract Factory]包子铺系列招式
- <context:property-placeholder location="classpath:com/foo/jdbc.properties"/>、元数据与一个定制配置BeanFactoryPo
- Struts2通配符映射/Struts <action name="/*/*" method="{2}" class="com.jxc.action.{1}Action"> <result
- <tx:method ... read-only="true" /> read-only提高查询性能的原因
- "VS.NET Web服务器运行的不是ASP.NET 1.1 版"的解决办法
- 简单工厂模式(Simple Factory) vs 工厂方法模式(Factory Method)
- VS.NET中的"生成解决方案"和"重新生成解决方案"有什么区别?
- 05.抽象工厂模式+反射--AbstractFactory&Reflect
- <form method=post action="addNew_hxxm.jsp" name="form1"enctype="multipart/form-data">
- VS 如何自动生成 aspx.designer.cs文件内容(解决"The base class includes the field ''"错误)