设计模式-女娲造人

使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,如果传入参数R,则返回一个Robot对象。请用程序设计实现上述场景。

 

 

 java代码实现

public class Earth {

    public static void main(String []args) {
        Person p;
        String name=XMLUtil.getName();
        try {
            p=NvWa.makePerson(name);
            p.show();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            System.out.println(e.getMessage());
        }
    
    }

}

Female

public class Female implements Person{

    @Override
    public void show() {
        // TODO Auto-generated method stub
          System.out.println("我是一名女人");        
    }

}

Male

 

public class Male implements Person{

    
    @Override
    public void show() {
        // TODO Auto-generated method stub
    
        System.out.println("我是一名男人");
    }

}

NvWa

public class NvWa {

    public static Person makePerson(String p)throws Exception {
        if(p.equalsIgnoreCase("Male")){
            System.out.println("NvWa造出来男人");
            return new Male();
        }else if(p.equalsIgnoreCase("Female")) {
            System.out.println("Femal");
            return new Female();
        }else {
            throw new Exception("对不起,NvWa没有造外星人");
        }
    }
}

Person

public interface Person {

    public void show();

}

XMLUtil

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

public class XMLUtil {

    public static String getName() {

        try
        {
            //创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc;                            
            doc = builder.parse(new File("src\\config.xml")); 
        
            //获取包含品牌名称的文本节点
            NodeList nl = doc.getElementsByTagName("Name");
            Node classNode=nl.item(0).getFirstChild();
            String Name=classNode.getNodeValue().trim();
            return Name;
           }   
               catch(Exception e)
               {
                   e.printStackTrace();
                   return null;
               }
    }
}

C++代码实现

#include<iostream>
#include<String>
#include"tinyxml2.h"
using namespace std;
using namespace tinyxml2;
class Person{

public:
    virtual void show() = 0;
};

class Female :public Person{

public:
    void show(){
        cout << "我是一名女人" << endl;
    }

};

class Male :public Person{
public:
    void show(){
        cout << "我是一名男人" << endl;
    }

};

class NvWa {
public:
    static Person *makePerson(string p){
        if (p == "Male"){
            cout << "NvWa造出来男人" << endl;
            return new Male();

        }
        else if (p == "Female"){
            cout << "NvWa造出来女人" << endl;
            return new Female();
        }
        else{
            return NULL;
        }
    }

};

int main(){
    NvWa nw;
    XMLDocument xml;
    xml.LoadFile("config.xml");

    XMLElement *category = xml.RootElement();
    XMLElement *con = category->FirstChildElement("Name");
    const char* name = con->GetText();
    cout << name << endl;

    Person *p = nw.makePerson(name);
    p->show();

}

 

posted @ 2021-09-23 16:08  好吗,好  阅读(183)  评论(0)    收藏  举报