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,如果在需要加入產品類,不在需要修改工廠類,而只需相應的添加一個實現工廠接口的具體工廠類。