设计模式6——Factory设计模式

来源:互联网 发布:成都软件学院 编辑:程序博客网 时间:2024/05/01 06:24

Factory工厂设计模式为创建对象提供了一种抽象,而对使用者屏蔽了对象创建的具体细节过程,工厂模式有三种:简单工厂模式,抽象工厂模式和工厂方法模式。

(1).简单工厂模式:

又叫静态工厂模式,简单工厂只包括一个抽象产品类(该类可以是接口,也可以是具体的类),所有需要的产品类都是该抽象产品类的子类。简单工厂模式中工厂为具体产品工厂,产品为抽象产品,由工厂实例创建产品实例:


一个生成圆形和矩形的图形工厂,例子如下:

[java] view plaincopy
  1. //图形接口  
  2. interface Shape(){  
  3.     public void draw();  
  4. }  
  5. //圆形  
  6. class Circle implements Shape{  
  7.     public void draw(){  
  8.     System.out.println(“Circle is drawing”);  
  9. }  
  10. }  
  11. //矩形  
  12. class Rectangle implements Shape{  
  13.     public void draw(){  
  14.     System.out.println(“Rectangle is drawing”);  
  15. }  
  16. }  
  17. //图形工厂  
  18. class ShapeFactory{  
  19.     public static Shape createShape(String name) throws InstantiationException,   
  20.                                       IllegalAccessException,   
  21.                                       ClassNotFoundException  
  22.     {  
  23.     //使用java的反射机制来产生对象实例  
  24.     return (Shape)class.forName(name).newInstance();  
  25. }  
  26. }   
  27. public class ShapeDemo{  
  28.     public static void draw(Shape shape){  
  29.     shape.draw();  
  30. }  
  31.     public static void main(String[] args){  
  32.     draw(ShapeFactory.createShape(“Circle”));  
  33.     draw(ShapeFactory.createShape(“Rectangle”));  
  34. }  
  35. }  

图形工厂负责具体图形的对象实例化工作,图形使用者使用时不需要关心图形对象的具体产生过程。

(2).抽象工厂模式:

抽象工厂模式中可以包括多个抽象产品类,每个抽象产品类可以产生出多个具体产品类,一个抽象工厂用于定义所需产品的组合形式,抽象工厂派生具体工厂类,这些具体工厂类就是简单工厂模式中的工厂类,具体工厂类负责具体产品实例的创建:


以软件皮肤为例,软件皮肤由样式style和颜色color组成,实现一套IOS风格的软件皮肤,一套Android风格的软件皮肤,通过抽象工厂实现软件皮肤自由切换例子如下:

[java] view plaincopy
  1. //软件皮肤类   
  2. class Skin{  
  3.     private SkinFactory skinFactory;  
  4.     public Skin(SkinFactory factory){  
  5.     setSkinFactory(factory);  
  6. }  
  7. public void setSkinFactory(SkinFactory factory){  
  8.     this.skinFactory = factory  
  9. }  
  10. public void showSkin(){  
  11.     System.out.println(“Style=” + factory.getStyle().showStyle() + “, color=” + factory.getColor().showColor());  
  12. }  
  13. }  
  14. //软件Style  
  15. interface Style(){  
  16.     public void showStyle();  
  17. }  
  18. //IOS style  
  19. class IOSStyle implements Style{  
  20.     public void showStyle(){  
  21.     System.out.println(“This is IOS style”);  
  22. }  
  23. }  
  24. //Android style  
  25. class AndroidStyle implements Style{  
  26.     public void showStyle(){  
  27.     System.out.println(“This is Android style”);  
  28. }  
  29. }  
  30. //软件Color  
  31. interface Color(){  
  32.     public void showColor();  
  33. }  
  34. //IOS color  
  35. class IOSColor implements Color{  
  36.     public void showColor(){  
  37.     System.out.println(“This is IOS color”);  
  38. }  
  39. }  
  40. //Android color  
  41. class AndroidColor implements Color{  
  42.     public void showColor(){  
  43.     System.out.println(“This is Android color”);  
  44. }  
  45. }  
  46. //抽象皮肤工厂  
  47. interface SkinFactory{  
  48.     public Style getStyle();  
  49.     public Color getColor();  
  50. }  
  51. //IOS皮肤工厂  
  52. class IOSSkinFactory implements SkinFactory{  
  53.     public Style getStyle(){  
  54.         return new IOSStyle();  
  55. }  
  56.     public Color getColor(){  
  57.         return new IOSColor();  
  58. }  
  59. }  
  60. //Android皮肤工厂  
  61. class AndroidSkinFactory implements SkinFactory{  
  62.     public Style getStyle(){  
  63.         return new AndroidStyle();  
  64. }  
  65.     public Color getColor(){  
  66.         return new AndroidColor();  
  67. }  
  68. }  
  69. public class SkinDemo{  
  70.     public static void main(String[] args){  
  71.         //显示一套IOS皮肤  
  72.     Skin skin = new Skin(new IOSSkinFactory());  
  73.     skin.showSkin();  
  74.     //换一套Android的皮肤  
  75.     skin.setSkinFactory(new AndroidSkinFactory());  
  76.     skin.showSkin();  
  77. }  
  78. }  

抽象工厂指定了产品组合形式,具体的工厂产生具体的产品,抽象工厂适用于多个产品相互组合的情况。

(3).工厂方法模式:

工厂方法中也只包含一个抽象产品类,抽象产品类可以派生出多个具体产品类。工厂方法定义一个用于创建产品的接口,让子类决定实例化哪一个类,使得类的实例化延迟到子类。


工厂方法模式例子如下:

[java] view plaincopy
  1. //汽车接口  
  2. interface ICar{  
  3.     public void run();  
  4. }  
  5. //奔驰车  
  6. class BenzCar implements ICar{  
  7.     public void run(){  
  8.     System.out.println(“Benz car run”);  
  9. }  
  10. }  
  11. //宝马车  
  12. class BMWCar implements ICar{  
  13.     public void run(){  
  14.     System.out.println(“BMW car run”);  
  15. }  
  16. }  
  17. //抽象汽车工厂  
  18. abstract class CarFactory{  
  19.     public abstract ICar createCar();  
  20. }  
  21. //奔驰车工厂  
  22. class BenzCarFactory extends CarFactory{  
  23.     public ICar createCar(){  
  24.     return new BenzCar();  
  25. }  
  26. }  
  27. //宝马车工厂  
  28. class BMWCarFactory extends CarFactory{  
  29.     public ICar createCar(){  
  30.     return new BMWCar();  
  31. }  
  32. }  
  33. public class FactoryMethodDemo{  
  34.     public static void main(String[] args){  
  35.     CarFactory factory = new BenzCarFactory();  
  36.     ICar car = factory.createCar();  
  37.     car.run();  
  38.     factory = new BMWCarFactory();  
  39.     car = factory.createCar();  
  40.     car.run();  
  41. }  
  42. }  

工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。

使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。

三种工厂模式的区别:

简单工厂 : 用来生产同一等级结构中的任意产品,对于增加新的产品,无能为力。

工厂方法 :用来生产同一等级结构中的固定产品,支持增加任意产品。
抽象工厂 :用来生产不同产品族(由不同产品组合成的一套产品)的全部产品,对于增加新的产品,无能为力;支持增加产品族。  

0 0