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

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

一、實驗目的和要求:

1. 抽象工廠模式的運用

(1)案例背景:

計算機包含記憶體(RAM),CPU等硬體裝置

 
   

,根據如圖所示的“產品等級結構-產品族示意圖”,使用抽象工廠模式實現計算機裝置建立過程並繪製類圖(課本105頁第二題)

 

 

 

 

 

(2)實現步驟:

  • 根據題意,使用抽象工廠模式並畫出類圖,類圖中應包含一個抽象工廠類AbstractFactory, PcFactory和MacFactory 兩個具體工廠,CPU,RAM兩個抽象產品類,PcCPU,MacCPU,PcRAM,MacRAM四個具體產品類。
  • 根據類圖,實現上述類的具體程式碼以及使用者類Client和輔助類XMLUtil以實現通過XML檔案來製造不同的產品
  • 更改XML中的屬性,觀察使用者類是否能使用不同的產品

(3)案例總結:

抽象工廠模式主要適用於:

  • 一個系統不應當依賴於產品類例項如何被建立、組合和表達的細節
  • 系統中有多於一個的產品族,但每次只使用其中某一產品族
  • 屬於同一個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來
  • 產品等級結構穩定,在設計完成之後不會向系統中增加新的產品等級結構或者刪除已有的產品等級結構

 

二、實驗平臺:

JDK 1.8.0

IDEA 2020.01

 

三、主要實驗內容及結果:

 

程式碼結構:

 

 

 

詳細程式碼:

AbstractFactory.java:

import abstractFactory.abstractProduct.CPU;
import abstractFactory.abstractProduct.RAM;

public interface AbstractFactory {
    public CPU productCPU();
    public RAM productRAM();
}

 

MacFactory.java:
import abstractFactory.abstractFactory.AbstractFactory;
import abstractFactory.abstractProduct.CPU;
import abstractFactory.abstractProduct.RAM;
import abstractFactory.concreteProduct.MacCPU;
import abstractFactory.concreteProduct.MacRAM;

public class MacFactory implements AbstractFactory {
    public CPU productCPU(){
        return new MacCPU();
    }

    public RAM productRAM(){
        return new MacRAM();
    }
}
 
 
PcFactory.java:
import abstractFactory.abstractFactory.AbstractFactory;
import abstractFactory.abstractProduct.CPU;
import abstractFactory.abstractProduct.RAM;
import abstractFactory.concreteProduct.PcCPU;
import abstractFactory.concreteProduct.PcRAM;

public class PcFactory implements AbstractFactory {
    public CPU productCPU(){
        return new PcCPU();
    }

    public RAM productRAM(){
        return new PcRAM();
    }
}
 
 
 
CPU.java:
public interface CPU  {
    public void product();

}
 
 
RAM.java:
public interface RAM {
    public void product();
}
 
 
 
MacCPU
import abstractFactory.abstractProduct.CPU;

public class MacCPU implements CPU {
    public void product(){
        System.out.println("MacCPU is producting....");
    }
}
 
 
MacRAM
import abstractFactory.abstractProduct.RAM;

public class MacRAM implements RAM {
    public void product(){
        System.out.println("MacRAM is producting...");
    }
}
 
 
PcCPU
import abstractFactory.abstractProduct.CPU;

public class PcCPU implements CPU {
    public void product(){
        System.out.println("PcCPU is producting...");
    }
}
 
 
PcRAM
import abstractFactory.abstractProduct.RAM;

public class PcRAM implements RAM {
    public void product(){
        System.out.println("PcRAM is producting...");
    }
}
 
 
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/abstractFactory/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>abstractFactory.concreteFactory.MacFactory</className>
</config>

 

 

 

 

Client
package abstractFactory.Client;

import abstractFactory.abstractFactory.AbstractFactory;
import abstractFactory.abstractProduct.CPU;
import abstractFactory.abstractProduct.RAM;
import abstractFactory.utils.XMLUtil;

public class Client {
    public static void main(String[] args) {
        try {
            AbstractFactory factory;
            CPU cpu;
            RAM ram;
            factory = (AbstractFactory) XMLUtil.getBean();
            cpu = factory.productCPU();
            ram = factory.productRAM();
            cpu.product();
            ram.product();
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }
}

 

 

實驗結果:

 

 

 

 

 

 

 

 

 

 

 

 

四、心得體會

出現的問題:抽象工廠類應該是一個介面類,建立的時候粗心建立成了普通類,導致具體介面類無法實現抽象介面類。

解決方法:通過仔細對比之前剛學完時所寫的程式碼,順利發現問題並改正。

體會:寫程式碼不能圖快,要經過仔細審題,畫類圖,建結構,仔細看好專案的結構和細節之後再動筆。