設計模式:簡單工廠,工廠模式,抽象工廠模式

 

參考: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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章