1. 程式人生 > >建立型模式之工廠方法模式

建立型模式之工廠方法模式

     建立型模式的目的就是使物件的建立和使用分離。  

通過簡單工廠方法模式的分析發現它依然存在著工廠類不符合設計原則的問題,於是就產生了工廠方法模式。它較之於簡單工廠方法模式的區別是一個工廠不再生產多個產品,而是一個工廠生產一個產品。 這裡寫圖片描述

public interface factory{
    public abstract tv getTv();
}
class haierfactory implements factory{
    public tv getTV(){
        return new haier();
    }
}
class haixinfactory
implements factory{
public tv getTV(){ return new haixin(); } } class tclfactory implements factory{ public tv getTV(){ return new tcl(); } } class samsungfactory implements factory{ public tv getTV(){ return new sumsang(); } }
public interface tv{
    abstract
void play(); }
class haier implements tv{
    public void play(){  
        System.out.print("haier play");
    };
}
class haixin implements tv{
    public void play(){  
        System.out.print("haixin play");
    };
}
class tcl implements tv{
    public void play(){  
        System.out.print
("tcl play"); }; }
class samsung implements tv{
    public void play(){  
        System.out.print("samsung play");
    };
}
public class watch{
    public static void main(){  
        //首先要根據條件創建出具體的工廠的物件,但具體開發會使用反射機制
        factory f = null;
        if(...){f = new haierfactory();}
        ...
        else if(...){f = new samsungfactory();}
        f.getTv().play();
    }
}

具體開發時,先在配置檔案中配置想要的工廠類,另寫一個工具類。

<?xml version="1.0"?>
<config>
    <className>haierfactory</className>
</config> 
public class XMLUtil{
    public static Object getBean(){  
        //建立DOM文件物件
    DocumentBuilderFactory dFactory =DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = dFactory.newDocumentBuilder();
    Document doc;   
    doc = builder.parse(new File("config.xml")); 

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

            /*通過類名生成例項物件並將其返回。  

          通過Class類的forName()方法返回與帶有給定字串名的類或介面相關聯的Class對  
          象, 再通過newInstance()方法建立此物件所表示的類的一個新例項,即通過一個類  
          名字串得到類的例項.
            */
            Class c=Class.forName(cName);
            Object obj=c.newInstance();
            return obj;

    }
}
public class watch{
    public static void main(){  
        factory f = (factory)XMLUtil.getBean();
        f.getTv().play();
    }
}