1. 程式人生 > 其它 >設計模式-抽象工廠模式例項-01

設計模式-抽象工廠模式例項-01

設計模式-抽象工廠模式例項-01

要點:

需要一個工廠生產多個產品物件。

優點:

隔離了具體類的生成,使客戶端不知道什麼被建立;

保證客戶端始終只使用一個產品族的物件;

增加新的產品族很方便,符合開閉原則。

缺點:

增加新的產品等級結構很複雜,不符合開閉原則。

適用環境:

一個系統不應當依賴於產品類的例項如何被建立、組合和表達的細節;

系統中有多個產品族但每次只使用其中某一產品族;

屬於同一個產品族的產品將在一起被使用;

產品等級結構穩定。

靜態工廠模式、工廠方法模式、抽象工廠模式對比:

 

 

 

例項1:海爾工廠和TCL工廠生產電視和空調。

類圖

程式碼實現:

程式碼結構:

 

 

factory:

EFactory:

import abstractTVFactory.airConditioner.AirConditioner;
import abstractTVFactory.television.Television;

//抽象工廠類
public interface EFactory {
    public Television produceTelevision();
    public AirConditioner produceAirConditioner();
}

 

HaierFactory:

import abstractTVFactory.airConditioner.AirConditioner;
import abstractTVFactory.airConditioner.HaierAirConditioner; import abstractTVFactory.television.HaierTelevision; import abstractTVFactory.television.Television; //具體工廠類HaierFactory public class HaierFactory implements EFactory { public Television produceTelevision(){ return new HaierTelevision(); }
public AirConditioner produceAirConditioner(){ return new HaierAirConditioner(); } }

 

TCLFactory:

import abstractTVFactory.airConditioner.AirConditioner;
import abstractTVFactory.airConditioner.TCLAirConditioner;
import abstractTVFactory.television.TCLTelevision;
import abstractTVFactory.television.Television;

//具體工廠類TCLFactory
public class TCLFactory implements EFactory {
    public Television produceTelevision(){
        return new TCLTelevision();
    }
    public AirConditioner produceAirConditioner(){
        return new TCLAirConditioner();
    }
}

 

 

television:

Television:

 

//抽象產品類
public interface Television {
    public void play();
}

 

HaierTelevision:

 

//具體產品類HaierTV
public class HaierTelevision implements Television {
    public void play(){
        System.out.println("Haier TV is playing");
    }
}

 

TCLTelevision:

 

//具體產品類TCLTV
public class TCLTelevision implements Television {
    public void play(){
        System.out.println("TCL TV is playing");
    }
}

 

 

 

airConditioner:

AirConditioner:

 

//抽象工廠類AirConditioner
public interface AirConditioner {
    public void use();
}

 

HaierAirConditioner:

 

//具體產品類Haier空調
public class HaierAirConditioner implements AirConditioner {
    public void use(){
        System.out.println("Haier AirConditioner is using");
    }
}

 

TCLAirConditioner:

 

//具體產品類TCL空調
public class TCLAirConditioner implements AirConditioner {
    public void use(){
        System.out.println("TCL AirConditioner is using");
    }
}

 

 

 

utils:

XMLUtil:

 

import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.SAXException;
import java.io.*;

public class XMLUtil {
    public static Object getBean(){
        try {
            //建立文件物件
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("src/abstractTVFactory/utils/config.xml"));
            //獲取包含支付方式名稱的文字節點
            NodeList nl = doc.getElementsByTagName("className");
            Node classNode=nl.item(0).getFirstChild();
            String cName=classNode.getNodeValue();
            //通過類名生成例項物件並將其返回
            Class c=Class.forName(cName);
            Object obj=c.newInstance();
            return obj;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

 

config.xml:

 

<?xml version="1.0"  ?>
<config>
    <className>abstractTVFactory.factory.TCLFactory</className>
</config>

 

Client:

Client:

 

import abstractTVFactory.airConditioner.AirConditioner;
import abstractTVFactory.factory.EFactory;
import abstractTVFactory.television.Television;
import abstractTVFactory.utils.XMLUtil;

public class Client {
    public static void main(String[] args) {
        try{
            EFactory factory;
            Television tv;
            AirConditioner airConditioner;
            factory = (EFactory) XMLUtil.getBean();
            tv = factory.produceTelevision();
            tv.play();

            airConditioner = factory.produceAirConditioner();
            airConditioner.use();

        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}