工廠方法模式-設計模式

1.OO原則:

      (1)OCP:開閉原則Open-Closed Principle,一個軟件的實體對擴展開放,對修改關閉。即對一個已有的軟件,如果需要擴展,應當在不需要修改已有代碼的基礎上進行。

      (2)DIP:依賴倒轉原則 Dependence Inversion Principle,要針對接口編程,而不要針對實現編程。

      (3)LoD:迪米特法則 Law of Demeter,只與你直接的朋友通信,而避免和陌生人通信。


2.工廠方法模式角色

      (1)抽象工廠角色:工廠方法模式的核心,與應用程序無關。

      (2)具體工廠角色:

      (3)抽象產品角色:

      (4)具體產品角色:

3.簡單實例:

      (1)產品Plant接口

//產品Plant接口
public interface Plant {

}

      (2)具體產品PlantA,PlantB

//具體產品PlantA
public class PlantA implements Plant {
      public PlantA () {
            System.out.println("creat PlantA");
      }
      public void doSomething () {
            System.out.println("PlantA do something...");
      }
}
//具體產品PlantB
public class PlantB implements Plant {
      public PlantB () {
           System.out.println("creat PlantB");
      }       
      public void doSomething () {
           System.out.println("PlantB do something...");}       
      }

      (3)產品Fruit接口

package model;
//產品Fruit接口
public interface Fruit {

}

      (4)具體產品FruitA,FruitB

//具體產品FruitA
public class FruitA implements Fruit {
	public FruitA () {
		System.out.println ("create FruitA");
	}
	public void doSomething () {
		System.out.println ("FruitA do something...");
	}
}
//具體產品FruitB
public class FruitB implements Fruit {
	public FruitB () {
		System.out.println ("create FruitB");
	}
	public void doSomething () {
		System.out.println ("FruitB do something...");
	}
}

      (5)抽象工廠方法

//抽象工廠方法
public interface AbstractFactory {
	public Plant createPlant();
	public Fruit createFruit();
}

      (6)具體工廠方法

//具體工廠方法
public class FactoryA implements AbstractFactory {
	@Override
	public Plant createPlant() {
		return new PlantA();
	}
	@Override
	public Fruit createFruit() {
		return new FruitA();
	}
}
public class FactoryB implements AbstractFactory {
	@Override
	public Plant createPlant() {
		return new PlantB();
	}
	@Override
	public Fruit createFruit() {
		return new FruitB();
	}
}

4.簡單工廠模式與工廠方法模式比較:

      (1)簡單工廠模式:靜態工廠模式,用來實例化目標類的靜態類。實例如下:

//運動員
public interface player {
	public void run();
	public void jump();
}
//足球運動員
public class soccer implements player {
        @Override
        public void run() {
        
        }
        @Override
        public void jump() {
        
        }
}
//籃球運動員
//籃球運動員
public class baskerballer implements player {
	@Override
	public void run() {
		
	}
	@Override
	public void jump() {
		
	}
}
///體育協會  註冊運動員
public class game {

	public static player createSoccer() {
		return new soccer();
	}
	
	public static player createBask() {
		return new baskerballer();
	}
}
//俱樂部
public class club {

	private player shouMen;
	private player houWei;
	private player qianFeng;
	
	public void test() {
		this.qianFeng = game.createSoccer();
		this.houWei = game.createSoccer();
		this.shouMen = game.createSoccer();
		
		shouMen.run();
		houWei.jump();
	}
}
        這是簡單工廠模式的一個簡單實例,不用接口不用工廠把具體類暴露給客戶端的混亂情形;如果增加一個“乒乓球運動員”產品類,就必須修改“體育協會”工廠類,增加個“註冊乒乓球運動員”方法。所以可以看出簡單工廠模式是不完全滿足OCP的。

      (3)工廠方法模式和簡單工廠模式最大的不同在於,簡單工廠模式只有一個工廠類,而工廠方法模式有一組實現了相同接口的工廠類,下例子介紹工廠方法的一個實現。

//運動員
public interface player {
	public void run();
	public void jump();
}
//足球運動員
public class soccer implements player {

	@Override
	public void run() {
		
	}

	@Override
	public void jump() {
		
	}
	
} 
//籃球運動員
public class baskerballer implements player {

	@Override
	public void run() {
		
	}

	@Override
	public void jump() {
		
	}

}
//體育協會 註冊
//體育協會 註冊
public interface game {
	public player zhuCe();
}
//足球協會
public class soccerGame implements game {
	
	@Override
	public player zhuCe() {
		return new soccer();
	}
}
//籃球協會
public class baskerballerGame implements game {

	@Override
	public player zhuCe() {
		return new baskerballer();
	}
}
//俱樂部
public class club {

	private player shouMen;
	private player houWei;
	
	public void test() {
		
		game chinaGame = new soccerGame();

		this.shouMen = chinaGame.zhuCe();
		this.houWei = chinaGame.zhuCe();
		
		shouMen.run();
		houWei.jump();
	}
}
      “體育協會”工廠類變成了“體育協會接口”,實現此接口的分別是“足球協會”和"籃球協會"具體的工廠類。這樣就完全OCP,如果在需要加入產品類,不在需要修改工廠類,而只需相應的添加一個實現工廠接口的具體工廠類。

發佈了28 篇原創文章 · 獲贊 19 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章