设计模式-女娲造人
使用简单工厂模式模拟女娲(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(); }