1. 程式人生 > 其它 >軟體設計-抽象工廠模式

軟體設計-抽象工廠模式

使用抽象工廠模式,完成下述產品等級結構:

類圖

程式碼結構

java

package rjsj.no4;

public class BlackSkinWomen implements Women{
    public void play() {
        System.out.println("黑色面板的女人出現");
    }
}
package rjsj.no4;

public class Client {
    public static void main(String args[]) {
        try {
            MWFactory factory;
            Man m;
            Women w;
            factory
=(MWFactory) XMLUtil.getBean(); m=factory.produceMan(); m.play(); w=factory.produceWomen(); w.play(); } catch(Exception e) { System.out.println(e.getMessage()); } } }
package rjsj.no4;

public class BlackFactory implements
MWFactory{ public Man produceMan() { return new BlackSkinMan(); } public Women produceWomen() { return new BlackSkinWomen(); } }
package rjsj.no4;

public class BlackSkinMan implements Man{
    public void play() {
        System.out.println("黑色面板的男人出現");
    }
}
package
rjsj.no4; public class WhiteFactory implements MWFactory{ public Man produceMan() { return new WhiteSkinMan(); } public Women produceWomen() { return new WhiteSkinWomen(); } }
package rjsj.no4;

public class WhiteSkinMan implements Man{
    public void play() {
        System.out.println("白色面板的男人出現");
    }
}
package rjsj.no4;

public class WhiteSkinWomen implements Women{
    public void play() {
        System.out.println("白色面板的女人出現");
    }
}
<?xml version="1.0"?>
<config>
    <className>YellowFactory</className>
</config>
package rjsj.no4;

public interface Man {
    public void play();
}
package rjsj.no4;

public interface MWFactory {
    public Man produceMan();
    public Women produceWomen();
}
package rjsj.no4;

public class YellowFactory implements MWFactory{
    public Man produceMan() {
        return new YellowSkinMan();
    }

    public Women produceWomen() {
        return new YellowSkinWomen();
    }
}
package rjsj.no4;

public class YellowSkinMan implements Man{
    public void play() {
        System.out.println("黃色面板男人出現");
    }
}
package rjsj.no4;

public class YellowSkinWomen implements Women{
    public void play()
    {
        System.out.println("黃色面板的女人出現");
    }
}
package rjsj.no4;

public interface Women {
    public void play();
}
package rjsj.no4;

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

public class XMLUtil {
    //該方法用於從XML配置檔案中提取具體類類名,並返回一個例項物件
    public static Object getBean() {
        try {
            //建立文件物件
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;
            doc = builder.parse(new File("src/rjsj/no4/config.xml"));

            //獲取包含類名的文字節點
            NodeList nl = doc.getElementsByTagName("className");
            //System.out.println(nl);
            Node classNode=nl.item(0).getFirstChild();
            String cName=classNode.getNodeValue();

            //通過類名生成例項物件並將其返回
            Class c=Class.forName("rjsj.no4."+cName);
            Object obj=c.newInstance();
            return obj;
        }
        catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

C++

#include <iostream>

using namespace std;

class SexFactory{
public:
    virtual void produce(){
        cout<<"無性別孩子"<<endl;
    }
};

class girlFactory:public SexFactory{
public:

    void produce(){
        // TODO Auto-generated method stub
        cout<<"女孩"<<endl;
    }
};

class boyFactory:public SexFactory{
public:
    void produce(){
        // TODO Auto-generated method stub
        cout<<"男孩"<<endl;
    }
};

class ColorFactory{
public:
    virtual void produce(){
        cout<<"透明";
    };
};

class yellowFactory:public ColorFactory{
public:
    void produce(){
        // TODO Auto-generated method stub
        cout<<"黃種";
    }
};

class whiteFactory:public ColorFactory{
public:
    void produce(){
        // TODO Auto-generated method stub
        cout<<"白種";
    }
};

class blackFactory:public ColorFactory{
public:
    void produce(){
        // TODO Auto-generated method stub
        cout<<"黑種";
    }
};

class Person{
public:
    Person(){
        SexFactory* sex;
        ColorFactory* color;
        int s,c;
        cout<<"請輸入你要生產的小人的性別 1是女孩 2是男孩"<<endl;
        cin>>s;
        cout<<"請輸入你要生產的小人的顏色 1是黃種 2是黑種 3是白種"<<endl;
        cin>>c;
        cout<<"您生產了一個";

        yellowFactory y;
        blackFactory b;
        whiteFactory w;
        switch(c) {
        case 1:
            color=&y;
            break;
        case 2:
            color=&b;
            break;
        case 3:
            color=&w;
            break;
        default:;
        }
        color->produce();

        girlFactory g;
        boyFactory bo;
        switch(s) {
        case 1:
            sex=&g;
            break;
        case 2:
            sex=&bo;
            break;
        default:;
        }
        sex->produce();

    }
};

int main()
{
    Person person;
    return 0;
}

執行截圖