工厂工厂,顾名思义就是生产产品的加工厂。抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
工厂模式在实际应用中用的非常多,比如说大家用的QQ的换皮肤功能,就是应用工厂模式实现的。只要选中某个皮肤,整个界面风格都改变了,包括背景图、按钮、界面风格等。下面我就用工厂模式来实现简单的换皮肤功能。
假如一套皮肤有背景图片、界面和按钮,这些我们叫做抽象产品,比如说背景图片有红色风格背景图片、蓝色风格背景图片,界面也有红色风格界面和蓝色风格界面,界面也一样。首先我们建立这些抽象产品:
BackGround.java
1 public abstract class Background {2 public abstract void showBgPic();3 }
Button.java
1 public abstract class Button {2 public abstract void onclick();3 }
QQFrame.java
1 public abstract class QQFrame {2 public abstract void printColor();3 }
然后建立具体产品,如建立一个红色风格的皮肤,则需要建立红色风格的背景图片、红色风格的界面、红色风格的按钮。代码如下
1 BlueBackground.java 2 public class BlueBackground extends Background { 3 4 @Override 5 public void showBgPic() { 6 System.out.println("蓝色的背景图片...."); 7 } 8 9 }10 11 BlueButton.java12 public class BlueButton extends Button {13 14 @Override15 public void onclick() {16 System.out.println("蓝色风格的按钮被按下");17 }18 19 }20 21 BlueFrame.java22 public class BlueFrame extends QQFrame {23 24 @Override25 public void printColor() {26 System.out.println("蓝色的界面风格");27 }28 29 }
然后建立抽象工厂SkinFactory,抽象工厂包括创建背景图片、创建界面、创建按钮的抽象方法,代码如下:
1 public abstract class SkinFactory {2 public abstract Background createBackground();3 public abstract Button createButton();4 public abstract QQFrame createFrame();5 }
写好抽象工厂之后就可以写具体的工厂了,比如说BlueSkinFactory,具体工厂要继承抽象工厂SkinFactory,并实现其的抽象方法。代码如下:
1 public class BlueSkinFactory extends SkinFactory { 2 3 @Override 4 public Background createBackground() { 5 // TODO Auto-generated method stub 6 return new BlueBackground(); 7 } 8 9 @Override10 public Button createButton() {11 // TODO Auto-generated method stub12 return new BlueButtom();13 }14 15 @Override16 public QQFrame createFrame() {17 // TODO Auto-generated method stub18 return new BlueFrame();19 }20 21 }
最后写一个测试类,代码如下:
1 public class Test { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 SkinFactory skinFactory = new BlueSkinFactory(); 8 Background background = skinFactory.createBackground();//以后需要换皮肤只需改这一句 9 Button button = skinFactory.createButton();10 QQFrame frame = skinFactory.createFrame();11 background.showBgPic();12 button.onclick();13 frame.printColor();14 }15 16 }
这样就实现了简单的换皮肤功能了。如果需要换皮肤,则只要将具体工厂换一个就好了,比如说将SkinFactory skinFactory = new BlueSkinFactory()改成SkinFactory skinFactory = new RedSkinFactory() (不过首先要建立具体产品和具体的工厂).其他代码都无需改动,这样就很好的实现了可扩展性。