抽象工廠模式是工廠模式的泛化版。意思是抽象工廠模式能夠用來生產同一類別的一組產品。
之前的我們要生產iPhone手機和魅族手機。那現在我們既要生產iPhone手機和魅族手機,我們也要生產iPhone充電寶和魅族充電寶。
那現在在一個具體的工廠是可以生產同一品牌的手機和充電寶。
比iPhone工廠可以生產iPhone手機和iPhone充電寶。
簡言之,抽象工廠模式,就是爲了能生產同一等級的多種商品,下面的例子同一等級值得的同一個牌子。
下面我們用例子實現之
-------------------------------------------------------------------------------------------------------------------------------------------
//--------------抽象工廠------------------
package com.dp.abstractFactory;
/**
* 抽象工廠,生產手機,充電寶
* @author chendongj
*
*/
public abstract class AbstractFactory {
public abstract Phone createPhone();
public abstract ChongDianBao createChongDianBao();
}
//------------抽象產品(手機)--------------------------
package com.dp.abstractFactory;
/**
* 手機
* @author chendongj
*
*/
public abstract class Phone {
public void call(){
System.out.println("手機可以打電話!");
}
public void sendMessage(){
System.out.println("手機可以發短信!");
}
public void playVideo(){
System.out.println("手機可以播放視頻!");
}
}
//-----------抽象產品(充電寶)--------------------------
package com.dp.abstractFactory;
public abstract class ChongDianBao {
public void chongdian(){
System.out.print("充電寶給手機充電中...");
}
}
//------------具體的生產IPhone產品的工廠----------------------------
package com.dp.abstractFactory;
/**
* 生產IPhone系列產品的具體工廠
* @author chendongj
*
*/
public class IphoneFactory extends AbstractFactory{
public Phone createPhone(){
return new Iphone();
}
public ChongDianBao createChongDianBao(){
return new IphoneCDB();
}
}
//-------------具體的生產魅族產品的工廠-----------------------
package com.dp.abstractFactory;
/**
* 生產魅族系列產品的具體工廠
* @author chendongj
*
*/
public class MeiZuFactory extends AbstractFactory{
public Phone createPhone(){
return new MeiZuPhone();
}
public ChongDianBao createChongDianBao(){
return new MeiZuCDB();
}
}
//------------具體的iPhone手機----------------
package com.dp.abstractFactory;
public class Iphone extends Phone {
public void call(){
System.out.println("iPhone手機在打電話...");
}
public void sendMessage(){
System.out.println("iPhone在發短信...");
}
public void playVideo(){
System.out.println("iPhone在播放視頻...");
}
}
//----------具體的iPhone充電寶---------------------------
package com.dp.abstractFactory;
/**
* iphone充電寶
* @author chendongj
*
*/
public class IphoneCDB extends ChongDianBao{
public void chongdian(){
System.out.print("iPhone充電寶給iphone手機充電中...");
}
}
//-------------具體的魅族手機-------------------
package com.dp.abstractFactory;
public class MeiZuPhone extends Phone{
public void call(){
System.out.println("魅族手機在打電話...");
}
public void sendMessage(){
System.out.println("魅族手機在發短信...");
}
public void playVideo(){
System.out.println("魅族手機在播放視頻...");
}
}
//--------具體的魅族充電寶----------------------------------
package com.dp.abstractFactory;
/**
* 魅族充電寶
* @author chendongj
*
*/
public class MeiZuCDB extends ChongDianBao{
public void chongdian(){
System.out.print("魅族充電寶給魅族手機充電中...");
}
}
//--------------測試類(開始生產,拿貨)----------
package com.dp.abstractFactory;
public class TestAbstractFactory {
/**
* 測試抽象工廠模式
*/
public static void main(String[] args) {
//生產iphone系列產品
IphoneFactory iphoneFactory = new IphoneFactory();
Phone iphone = iphoneFactory.createPhone();
iphone.call();
iphone.sendMessage();
iphone.playVideo();
ChongDianBao iphoneCDB= iphoneFactory.createChongDianBao();
iphoneCDB.chongdian();
System.out.println();
System.out.println("--------------------");
//生產魅族系列產品
MeiZuFactory mzFactory = new MeiZuFactory();
Phone meizu = mzFactory.createPhone();
meizu.call();
meizu.sendMessage();
meizu.playVideo();
ChongDianBao meizuCDB = mzFactory.createChongDianBao();
meizuCDB.chongdian();
}
}
//==============輸出結果=================================
iPhone手機在打電話...
iPhone在發短信...
iPhone在播放視頻...
iPhone充電寶給iphone手機充電中...
--------------------
魅族手機在打電話...
魅族手機在發短信...
魅族手機在播放視頻...
魅族充電寶給魅族手機充電中...