Factory 工廠模式
工廠模式實現了創建者和調用者的分離。
分類:
1.簡單工廠
2.工廠方法模式:定義一個用於創建對象的接口,讓子類決定實例化哪一個類,工廠方法使一個類的實例化延遲到其子類
3.抽象工廠:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
面向對象設計的基本原則:
OCP(開閉原則,Open-Closed Principle):
一個軟件的實體應當對擴展開放,對修改關閉。也就是說如果你要對一個已存在的系統做擴展的時候儘量要新增加類,而不是在原有的基礎上修改。
DIP(依賴倒轉原則,Dependence Inversion Principle)
針對接口編程,不要針對實現編程。
LoD(迪米特法則,Law Of Demeter)
只與你直接的朋友通信,而避免和陌生人通信。一個類儘量少的依賴其他類
簡單工廠:
很多業務類的實現都會用到這個模式,簡單直接 就改。
//create subject interface
public interface Subject(){
public void create();
}
//Create Subject Factory
public class Subject {
public static Subject createSubject (String subJectType){
if("Cat".equals(subJectType)){
return new Cat();
}
if("Dog".equals(subJectType)){
return new Dog();
}
return null;
}
}
//Test
public class Test{
public static void main(String[] org){
SUbject cat = Subject.createSubject("Cat");
SUbject dog = Subject.createSubject("Dog");
cat.create();
dog.create();
}
}
工廠方法模式:將工廠類調整爲工廠接口,需要什麼類型的工廠就使用該類實現該工廠,創建相應的產品
//工廠接口
public interface CarFactory {
//創建汽車方法
Car createCar();
}
//創建比亞迪汽車的工廠
public class BydFactory implements CarFactory{
@Override
public Car createCar() {
return new Byd();
}
}
//創建奧迪的工廠
public class AudiFactory implements CarFactory {
@Override
public Car createCar() {
return new Audi();
}
}
//測試工廠方法
public class TestFactoryMethod {
public static void main(String[] args) {
/**
* 工廠方法模式好處在於,以後如果再增加一輛車。只需再實現CarFactory接口即可。避免了OCP開閉原則
* 不用在原來的代碼上修改,只需新增類即可。
* 例如:增加一輛奔馳,增加一個奔馳工廠BenzFactory即可。更好擴展
*/
Car audi = new AudiFactory().createCar();
Car byd = new BydFactory().createCar();
audi.run();
byd.run();
}
}
抽象工廠模式:抽象工廠模式用來生產不同產品族的全部產品,對於只增加產品某一部分則不適用。抽象工廠模式是工廠模式的一種升級版本。
在有多個業務品種,業務分類時,抽象工廠能產品不同類別的一個全部產品。例如:生產汽車,抽象工廠模式可以生產高端汽車全部配件來組成一個高端汽車,
低端汽車全部配件來組成要給低端的汽車,但是不能產生一個高端的發動機和一個低端的座椅來組成一箇中等的汽車。這樣會混亂。
/**
* 發動機接口
*/
public interface Engine {
void run();
void start();
}
//好的發動機
class LuxuryEngine implements Engine{
@Override
public void run() {
System.out.println("好發動機轉的快");
}
@Override
public void start() {
System.out.println("啓動快,自動啓停");
}
}
//差的發動機
class LowEngine implements Engine{
@Override
public void run() {
System.out.println("轉的慢");
}
@Override
public void start() {
System.out.println("啓動慢");
}
}
/**
* 汽車總工廠,可以創建輪胎,座椅,發動機
*/
public interface CarFactory {
Engine createEngine();//創建發動機
Seat createSeat();//創建座椅
Tyre createTyre();//創建輪胎
}
/**
* 高端汽車製造工廠
*/
public class LuxuryCarFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LuxuryEngine();
}
@Override
public Seat createSeat() {
return new LuxurySeat();
}
@Override
public Tyre createTyre() {
return new LuxuryTyre();
}
}
/**
* 低端汽車製造工廠
*/
public class LowCarFactory implements CarFactory{
@Override
public Engine createEngine() {
return new LowEngine();
}
@Override
public Seat createSeat() {
return new LowSeat();
}
@Override
public Tyre createTyre() {
return new LowTyre();
}
}
public static void main(String[] args) {
//想要好車
CarFactory factory = new LuxuryCarFactory();
Engine engine = factory.createEngine();//創建高端發動機
engine.run();
engine.start();
//想要差一點的車
CarFactory factory2 = new LowCarFactory();
Engine e2= factory2.createEngine();
Seat s2 = factory2.createSeat();
Tyre t2 = factory2.createTyre();
e2.run();
e2.start();
//以後想要中等車的話可以增加相應中等配件的接口
}
工廠模式要點
簡單工廠模式(靜態工廠模式)
雖然某種程度不符合面向對象規則(不符合開閉原則,每次新增內容都需要在原有代碼上修改),但是實際使用最多。
工廠方法模式
不修改已有類的前提下,通過增加新類來實現擴展。
抽象工廠模式
不可以增加產品中某一個配件,可以增加一個具體的產品族。