工廠模式
工廠模式主要是爲創建對象提供過渡接口,以便將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。封裝性好,通過簡單工廠,實現了客戶端和具體實現類的解耦。
分類
2)工廠方法模式(Factory Method):又稱爲多形性工廠;
3)抽象工廠模式(Abstract Factory):又稱爲工具箱,產生產品族,但不利於產生新的產品;
GOF在《設計模式》一書中將工廠模式分爲兩類:工廠方法模式(Factory Method)與抽象工廠模式(Abstract Factory)。將簡單工廠模式(Simple Factory)看爲工廠方法模式的一種特例,兩者歸爲一類。
工廠方法模式(包含簡單工廠模式)
先來看看它的組成:
a) 工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯。在java中它往往由一個具體類實現。在java中由接口或者抽象類來實現。工廠類在客戶端的直接控制下(Create,LightSimpleFactory方法)創建產品對象。
b) 抽象產品角色:它一般是具體產品繼承的父類或者實現的接口。定義簡單工廠創建的對象的父類或它們共同擁有的接口。可以是一個類、抽象類或接口。
c) 具體產品角色:工廠類所創建的對象就是此角色的實例。在java中由一個具體類實現。定義工廠具體加工出的對象。
優點:
工廠類可以決定創建哪一個產品類的實例,客戶端可以免除直接創建產品對象的責任,而僅僅"消費"產品。實現了對責任的分割。
缺點:
工廠類集中了所有產品創建邏輯,一旦工廠不能正常工作,整個系統都要受到影響。
系統擴展困難,一旦添加新產品就不得不修改工廠邏輯(生產線)。
public class LightSimpleFactory {
public Light create(String lightType){
if(lightType == "red")
return new RedLight();
else if(lightType == "green")
return new GreenLight();
else
return null;
}
}
public interface Light {
public abstract void turnOn();
public abstract void turnOff();
}
具體產品角色:
public class RedLight implements Light {
@Override
public void turnOff() {
System.out.println(" red light turn off");
}
@Override
public void turnOn() {
System.out.println(" red light turn on");
}
}
public class GreenLight implements Light {
@Override
public void turnOff() {
System.out.println(" green light turn off");
}
@Override
public void turnOn() {
System.out.println(" green light turn on");
}
}
public class Test {
public static void main(String[] args) {
LightSimpleFactory lightSimpleFactory= new LightSimpleFactory();
Light redRight = lightSimpleFactory.create("red");
redRight.turnOn();
redRight.turnOff();
Light greenRight = lightSimpleFactory.create("green");
greenRight.turnOn();
greenRight.turnOff();
// print
// red light turn on
// red light turn off
// green light turn on
// green light turn off
}
}
抽象工廠模式
a)抽象工廠(Creator)角色:是工廠方法模式的核心,與應用程序無關。任何在模式中創建的對象的工廠類必須實現這個接口。b)具體工廠(Concrete Creator)角色:這是實現抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,並且受到應用程序調用以創建產品對象。在上圖中有兩個這樣的角色:BulbCreator與TubeCreator。
c)抽象產品(Product)角色:工廠方法模式所創建的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。在上圖中,這個角色是Light。
d)具體產品(Concrete Product)角色:這個角色實現了抽象產品角色所定義的接口。某具體產品有專門的具體工廠創建,它們之間往往一一對應。
public interface ILightFactory {
public Light creat();
}
具體工廠
public class RedLightFactory implements ILightFactory {
@Override
public Light creat() {
return new RedLight();
}
}
public class GreenLightFactory implements ILightFactory {
@Override
public Light creat() {
return new GreenLight();
}
}
抽象角色
public interface ILight {
public abstract void turnOn();
public abstract void turnOff();
}
具體角色
public class RedLight implements ILight {
@Override
public void turnOff() {
System.out.println(" red light turn off");
}
@Override
public void turnOn() {
System.out.println(" red light turn on");
}
}
public class GreenLight implements ILight {
@Override
public void turnOff() {
System.out.println(" green light turn off");
}
@Override
public void turnOn() {
System.out.println(" green light turn on");
}
}
客戶端
public class Test {
public static void main(String[] args) {
ILightFactory redLightFactory= new RedLightFactory();
RedLight redLight = (RedLight) redLightFactory.creat();
redLight.turnOn();
redLight.turnOff();
ILightFactory greenLightFactory= new GreenLightFactory();
GreenLight greenLight = (GreenLight) greenLightFactory.creat();
greenLight.turnOn();
greenLight.turnOff();
// red light turn on
// red light turn off
// green light turn on
// green light turn off
}
}
public class RedLightFactory implements ILightFactory {
@Override
public Light creat() {
return new RedLight();
}
}
public class GreenLightFactory implements ILightFactory {
@Override
public Light creat() {
return new GreenLight();
}
}