<其它设计模式介绍及案例源码下载 >
简介:工厂方法(FactoryMethod)不在工厂类中进行逻辑判断,程序可以为不同产品类提供不同的工厂,不同的工厂类产不同的产品。当使用工厂方法设计模式时,对象调用者需要与具体的工厂类耦合
四种角色组成:
抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
主要解决:我们明确地计划不同条件下创建不同实例时。主要解决接口选择的问题。
优点:当有新产品时,只要新建具体工厂继承抽象工厂;而不用修改任何一个类,工厂方法模式是完全符合开闭原则的!
缺点:每次增加一个产品时,都需要增加一个具体产品类和具体工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
实现案例:通过抽象工厂创建一个具体工厂,在工厂中创建出具体的产品
注意:当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的。所以我建议在这种情况下使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。
例如下:
//抽象产品 2.abstract class Car{ 3. private String name; 4. 5. public abstract void run(); 6. 7. public String getName() { 8. return name; 9. } 10. public void setName(String name) { 11. this.name = name; 12. } 13.} 14.//具体产品 15.class Benz extends Car{ 16. public void run(){ 17. System.out.println("开奔驰"); 18. } 19.} 20.class Bmw extends Car{ 21. public void run(){ 22. System.out.println("开宝马"); 23. } 24.} 25. 26. 27.//抽象工厂 28.abstract class Driver{ 29. public abstract Car createCar(); 30.} 31.//具体工厂(每个具体工厂负责一个具体产品) 32.class BenzDriver extends Driver{ 33. public Car createCar() { 34. return new Benz(); 35. } 36.} 37.class BmwDriver extends Driver{ 38. public Car createCar() { 39. return new Bmw(); 40. } 41.} 42. 43.//老板 44.public class Boss{ 45. 46. public static void main(String[] args) throws Exception { 47. Driver d = new BenzDriver(); 48. Car c = d.createCar(); 49. c.drive(); 50. } 51.}