一天一種設計模式之六-----工廠方法模式

一.工廠方法模式

  1. 工廠方法模式屬於建立型模式。java

  2. 工廠方法模式定義:定義一個用於建立對象的藉口,讓子類決定實例化哪個類。工廠方法使一個類的實例化延遲到了他的子類。mysql

  3. 通常工廠類會有一個工廠的接口,實現類也有一個實現的接口。工廠接口負責定義一個建立實現接口的方法,而工廠類負責建立具體的實現類。sql

  4. 工廠模式根據抽象程度的不一樣分爲三種:簡單工廠模式(也叫靜態工廠模式),工廠方法模式以及抽象工廠模式。工廠模式是編程中常常會遇到的一種模式。數據庫

  5. 工廠方法模式的優勢有:編程

    1. 使代碼結構清晰,有效的封裝變化。在編程中,產品類的實例化有時候是複雜多變的,經過工廠模式將產品的實例化封裝起來,是的調用者無需關心實例化過程只需依賴工廠便可獲得本身想要的產品。ide

    2. 對調用者屏蔽具體的產品類。若是使用工廠模式,調用者只須要關心產品的接口就能夠了,即便變動了具體的實現,對調用這來講沒有任何影響。sqlserver

  6. 工廠方法模式符合開放封閉原則,迪米特法則,依賴倒置原則。
    測試

    二.測試代碼

  7. 測試代碼以下(實現一個計算器)下屬模式中,若是新增了其餘的計算類,只須要新建一個計算類實現,和相應的計算類工廠就能夠了。
    this

  8. public class GongChangMethodTest {
    	public static void main(String[] args) {
    		IFactory factory = new SumFactory();
    		Jisuan jisuan = factory.createJisuan();
    		jisuan.setNum1(12);
    		jisuan.setNum2(44);
    		;
    		System.out.println(jisuan.getResult());
    	}
    }
    
    interface IFactory {
    	Jisuan createJisuan();
    }
    
    class SumFactory implements IFactory {
    
    	@Override
    	public Jisuan createJisuan() {
    		return new SumJisuan();
    	}
    
    }
    
    class SubFactory implements IFactory {
    	@Override
    	public Jisuan createJisuan() {
    		return new SubJisuan();
    	}
    }
    
    class MulFactory implements IFactory {
    	@Override
    	public Jisuan createJisuan() {
    		return new MulJisuan();
    	}
    }
    
    class DevFactory implements IFactory {
    	@Override
    	public Jisuan createJisuan() {
    		return new DevJisuan();
    	}
    }
    
    abstract class Jisuan {
    	private int num1;
    	private int num2;
    
    	public Jisuan() {
    	}
    
    	public Jisuan(int num1, int num2) {
    		this.num1 = num1;
    		this.num2 = num2;
    	}
    
    	public abstract int getResult();
    
    	public int getNum1() {
    		return num1;
    	}
    
    	public void setNum1(int num1) {
    		this.num1 = num1;
    	}
    
    	public int getNum2() {
    		return num2;
    	}
    
    	public void setNum2(int num2) {
    		this.num2 = num2;
    	}
    }
    
    class SumJisuan extends Jisuan {
    
    	@Override
    	public int getResult() {
    		return getNum1() + getNum2();
    	}
    
    }
    
    class SubJisuan extends Jisuan {
    
    	@Override
    	public int getResult() {
    		return getNum1() - getNum2();
    	}
    }
    
    class MulJisuan extends Jisuan {
    
    	@Override
    	public int getResult() {
    		return getNum1() * getNum2();
    	}
    }
    
    class DevJisuan extends Jisuan {
    
    	@Override
    	public int getResult() {
    		int result = 0;
    		if (getNum2() != 0) {
    			result = getNum1() / getNum2();
    		}
    		return result;
    	}
    }
  9. 企業級應用中,咱們對數據庫的實現就能夠採用上述模式
    實際上,咱們再加上其餘表,IFactory中再增長createXXXFactory就成了抽象工廠模式了,抽象工廠只是比工廠方法多了一個緯度而已
    spa

public class GongChangMethodTest {

	public static void main(String[] args) {
		IFactory factory=new MysqlUserFactory();
		IUserService service=factory.createUserService();
		service.insert();
	}
}	
interface IUserService{
	void insert();
}
class UserService implements IUserService{
	@Override
	public void insert() {
		System.out.println("insert 方法");
	}
}
interface IFactory{
	public IUserService createUserService();
}	
abstract class MysqlFactory implements IFactory{
	//這裏能夠作一些初始化mysql鏈接的事情
}
abstract class SqlServerFactory implements IFactory{
	//這裏能夠作一些初始化mysql鏈接的事情
}
//若是想換成sqlserver,只須要加一個SqlserverUserFactory就能夠了
class MysqlUserFactory extends MysqlFactory{
	@Override
	public IUserService createUserService() {
		return new UserService();
	}
	
}
相關文章
相關標籤/搜索