抽象工廠模式(Abstract Factory)
先上類圖吧,自己懶得畫了,找了個現成的
抽象工廠的引入是根據需求而產生的,說到這裏先要提到一個名字—產品族(Product Family),還是以生產汽車爲例,我想要一個上汽的汽車工廠能夠同時生產一款MPV,一款SUV和一款Sedan,那比如說它就是上海通用別克的工廠啦,可以生產MPV GL8,生產SUV 昂科威,可以生產Sedan 君威,這幾款產品就算是一個產品族。作爲公司高層,肯定是希望工廠能夠有能力同時生產這三款車,將這個工程抽象出來,就成了這個樣子:
public interface AbstractFactory {
public SUV makeSUV();
public MPV makeMPV();
public Sedan makeSedan();
}
不過這個例子並不好,因爲這裏的三種車輛還是屬於車輛,而產品族,是指不同的產品,這裏還是換一個例子來說明吧。
生產一個SUV,需要生產不同的零件,如輪胎,方向盤,發動機。該款SUV上的Tyre, SteeringWheel和Engine,則屬於一個產品族,一個SUV對象需要Tyre, SteeringWheel和Engine的實例才能正常工作。如果在SUV的類中,直接調用新建三種對象,當然是沒有問題的。問題出在,如果換一款SUV,輪胎,方向盤,發動機都變了,那我們就得重新新建TyreB, SteeringWheelB和EngineB. 爲了讓SUV更加通用,可以抽象出Tyre, SteeringWheel和Engine三個接口,然後實現不同的Tyre, SteeringWheel和Engine產品。 同時針對SUVA和SUVB兩種SUV。創建一個Creater接口,接口中定義了創建3中產品的方法。而在Creater接口的具體實現類中,則實現三種產品不同型號的創建。
我們抽象出來的類圖如下所示:
類圖
代碼:
三種產品
interface Tyre {
public void Roll();
}
class TyreA implements Tyre{
@Override
public void Roll() {
System.out.println("I am TyreA ,I am Big");
}
}
class TyreB implements Tyre{
@Override
public void Roll() {
System.out.println("I am TyreB ,I am Small");
}
}
interface SteeringWheel{
public void Turn();
}
class SteeringWheelA implements SteeringWheel{
@Override
public void Turn() {
System.out.println("I am SteeringWheelA ,I am Big");
}
}
class SteeringWheelB implements SteeringWheel{
@Override
public void Turn() {
System.out.println("I am SteeringWheelB ,I am Small");
}
}
interface Engine{
public void Roar();
}
class EngineA implements Engine{
@Override
public void Roar() {
System.out.println("I am EngineA ,I am 3.0Turbo ");
}
}
class EngineB implements Engine{
@Override
public void Roar() {
System.out.println("I am EngineB ,I am 1.6L ");
}
}
兩個工廠
public interface AbstractFactory {
public Tyre createTyre();
public SteeringWheel createSteeringWheel();
public Engine createEnginen();
}
class SUVFactory1 implements AbstractFactory{
@Override
public Tyre createTyre() {
return new TyreA();
}
@Override
public SteeringWheel createSteeringWheel() {
return new SteeringWheelA();
}
@Override
public Engine createEnginen() {
return new EngineA();
}
}
class SUVFactory2 implements AbstractFactory{
@Override
public Tyre createTyre() {
return new TyreB();
}
@Override
public SteeringWheel createSteeringWheel() {
return new SteeringWheelB();
}
@Override
public Engine createEnginen() {
return new EngineB();
}
}
使用工廠1創建的SUV
public class SUV {
public Tyre mTyre;
public SteeringWheel mSteeringWheel;
public Engine mEngine;
public AbstractFactory mFactory;
public SUV() {
mFactory=new SUVFactory1();
mTyre=mFactory.createTyre();
mSteeringWheel=mFactory.createSteeringWheel();
mEngine=mFactory.createEnginen();
}
public void show(){
mTyre.Roll();
mSteeringWheel.Turn();
mEngine.Roar();
}
}
測試類
public class Host {
public static void main(String[] args) {
SUV mSUV=new SUV();
mSUV.show();
}
}
輸出:
I am TyreA ,I am Big
I am SteeringWheelA ,I am Big
I am EngineA ,I am 3.0Turbo
這時如果需要創建另一款SmallSUV車型,只需要創建另一個SmallSUV類,並新建第二個工廠,生產另外小型號的三種產品。
public class SmallSUV {
public Tyre mTyre;
public SteeringWheel mSteeringWheel;
public Engine mEngine;
public AbstractFactory mFactory;
public SmallSUV() {
mFactory=new SUVFactory2();
mTyre=mFactory.createTyre();
mSteeringWheel=mFactory.createSteeringWheel();
mEngine=mFactory.createEnginen();
}
public void show(){
mTyre.Roll();
mSteeringWheel.Turn();
mEngine.Roar();
}
}
測試類
public class Host {
public static void main(String[] args) {
SmallSUV mSUV=new SmallSUV();
mSUV.show();
}
}
輸出
I am TyreB ,I am Small
I am SteeringWheelB ,I am Small
I am EngineB ,I am 1.6L
Android中的抽象工廠
暫時沒遇到,歡迎知道的童鞋告知在下,先行謝過。