參考:http://www.cnblogs.com/Bobby0322/p/4178412.html
簡單工廠:
水果工廠:只需知道水果的名字就可以得到相應的水果。可以根據參數的不同返回不同類的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
客戶端只需知道產品對應的參數(通過名字或者參數),就可以得到對應的實例。
Product是抽象接口或者抽象類,有兩個實現類,Factory根據傳入的參數判斷返回A還是B。
Product是接口,Factory是類不是接口
創建對象的職責交給工廠類,工廠類職責過重,一旦出現新的產品,工廠類就得變化,不符合開閉原則。
代碼:
工廠類Factory,專門生產產品,根據參數返回不同的產品。
package 簡單工廠模式;
public class Factory {
public Product createProduct(String name){
if(name.equals("A")){
return new ConcreteProductA();
}else if(name.equals("B")){
return new ConcreteProductB();
}else {
System.out.println("暫時沒有"+name+"類產品");
return null;
}
}
}
抽象產品類Product,抽象類或者接口:
package 簡單工廠模式;
/**
* 產品類的接口
* @author Administrator
*
*/
public interface Product {
}
具體產品類A,B,繼承或者實現抽象產品類
package 簡單工廠模式;
public class ConcreteProductA implements Product{
public ConcreteProductA(){
System.out.println("生產產品A");
}
}
package 簡單工廠模式;
public class ConcreteProductB implements Product {
public ConcreteProductB(){
System.out.println("生產產品B");
}
}
客戶端測試:
package 簡單工廠模式;
import org.junit.Test;
public class Client {
@Test
public void main(){
Product p = null;
Factory f = new Factory();
p = f.createProduct("A");
System.out.println(p);
p = f.createProduct("B");
System.out.println(p);
p = f.createProduct("C");
System.out.println(p);
}
}
測試結果:
工廠模式:
用戶無須關心創建細節,只關心所需產品對應的工廠。加入新產品,無須修改抽象工廠,客戶端,以及其他具體工廠產品。符合開閉原則。
Product是抽象的,Factory也是抽象的。
代碼:
抽象工廠Factory,抽象類或者接口
package 工廠模式;
/**
* 抽象工廠
* @author Administrator
*
*/
public interface Factory {
public Product createProduct();
}
具體工廠:
package 工廠模式;
/**
* 具體工廠
* @author Administrator
*
*/
public class ConcreteFactoryA implements Factory {
@Override
public Product createProduct() {
System.out.println("具體工廠類A");
return new ConcreteProductA();
}
}
抽象產品Product,抽象類或者接口
package 工廠模式;
/**
* 抽象產品
* @author Administrator
*
*/
public interface Product {
public void show();
}
具體產品
package 工廠模式;
public class ConcreteProductA implements Product{
public ConcreteProductA(){
System.out.println("具體商品");
}
@Override
public void show() {
System.out.println("正在生產具體產品A");
}
}
客戶端測試:
package 工廠模式;
import org.junit.Test;
public class Client {
@Test
public void main(){
Factory f;
Product p;
f = (Factory)XMLUtil.getBean();
p = f.createProduct();
p.show();
}
}
讀取配置文件的工具類:
package 工廠模式;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XMLUtil {
public static Object getBean(){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("src/config.xml"));
NodeList node = doc.getElementsByTagName("className");
Node classNode = node.item(0).getFirstChild();
String value = classNode.getNodeValue();
return Class.forName(value).newInstance();
} catch (Exception e) {
e.printStackTrace();
}//
return null;
}
}
測試結果:
抽象工廠模式:
需要生產某個品牌一系列的商品,比如,海爾工廠生產海爾電視機,海爾洗衣機等。
代碼:
抽象工廠,生產某個品牌一系列商品
package 抽象工廠模式;
public interface Factory {
//生產電視
public Television produceTelevision();
//生產空調
public AirConditioner produceAirConditioner();
}
具體工廠HaierFactory,生產海爾電視機,空調:
package 抽象工廠模式;
/**
* 具體工廠
* @author Administrator
*
*/
public class HaierFactory implements Factory {
@Override
public Television produceTelevision() {
return new HaierTelevision();
}
@Override
public AirConditioner produceAirConditioner() {
return new HaierAirConditioner();
}
}
具體工廠TCLFactory,生產TCL電視機,空調:
package 抽象工廠模式;
/**
* 具體工廠
* @author Administrator
*
*/
public class TCLFactory implements Factory {
@Override
public Television produceTelevision() {
// TODO Auto-generated method stub
return new TCLTelevision();
}
@Override
public AirConditioner produceAirConditioner() {
// TODO Auto-generated method stub
return new TCLAirConditioner();
}
}
抽象產品空調:
package 抽象工廠模式;
/**
* 抽象產品
* 空調
* @author Administrator
*
*/
public interface AirConditioner {
public void change();
}
抽象產品電視機:
package 抽象工廠模式;
/**
* 抽象電視機
* 抽象產品
* @author Administrator
*
*/
public interface Television {
public void play();
}
具體產品,海爾電視機:
package 抽象工廠模式;
/**
* 具體產品
* @author Administrator
*
*/
public class HaierTelevision implements Television {
@Override
public void play() {
System.out.println("海爾電視放映");
}
}
具體產品海爾空調:
package 抽象工廠模式;
/**
* 具體產品
* 空調
* @author Administrator
*
*/
public class HaierAirConditioner implements AirConditioner {
@Override
public void change() {
System.out.println("海爾空調");
}
}
具體產品,TCL空調:
package 抽象工廠模式;
/**
* 具體產品
* 空調
* @author Administrator
*
*/
public class TCLAirConditioner implements AirConditioner {
@Override
public void change() {
System.out.println("TCL空調");
}
}
具體產品,TCL電視機:
package 抽象工廠模式;
public class TCLTelevision implements Television {
@Override
public void play() {
System.out.println("TCL電視放映");
}
}
客戶端測試:
package 抽象工廠模式;
import org.junit.Test;
import 工廠模式.XMLUtil;
public class Client {
@Test
public void main(){
Factory f;
Television t;//電視機
AirConditioner a;//空調
f = (Factory)XMLUtil.getBean();
a = f.produceAirConditioner();
a.change();
t = f.produceTelevision();
t.play();
}
}
測試結果:
配置文件confog.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!-- <config>
<className>工廠模式.ConcreteFactoryA</className>
</config> -->
<config>
<className>抽象工廠模式.HaierFactory</className>
</config>