一、工廠模式(分為:簡單工廠模式、工廠方法模式、抽象工廠模式)
? ? 實現了創建者和調用者的分離
核心本質:1、實例化對象,用工廠方法代替new操作;2、將選擇實現類、創建對象統一管理和控制,從而將調用者跟實現類解耦。
簡單工廠模式:用來生產同一等級結構中的任意產品(對于增加的新的產品,需要修改已有代碼)
工廠方法模式:用來生產同一等級結構中的固定產品(支持增加任意產品)
抽象工廠模式:用來生產不同產品族中的全部產品(對于增加新的產品,無能為力。支持增加新的產品族)
【擴展】面向對象設計的基本原則(核心就是"分工")
OCP(開閉原則,Open-Closed Principle):一個軟件的實體應當對擴展開放,對修改關閉。
DIP(依賴倒轉原則,Dependence Inversion Principe):要針對接口編程,不要針對實現編程。
LoD(迪米特法則,Law of Demeter):只與你直接的朋友通信,避免和陌生人通信(某個類盡量與少的類反生依賴關系)。
二、各種模式詳解
1、簡單工廠模式(靜態工廠模式)
/*** 一個"汽車"類 接口 */ package cn.sxt.pattern;public interface Car {void run(); }/** "奧迪"類* */ package cn.sxt.pattern;public class Audi implements Car{public void run() {System.out.println("奧迪在跑!"); } }/*** "比亞迪"類*/ package cn.sxt.pattern;public class Byd implements Car{public void run() {System.out.println("比亞迪在跑!");} }
【沒有采用工廠模式】
/**** 沒有采用工廠模式的情況下*/ package cn.sxt.pattern;public class Test_0423_Client01 {//調用者public static void main(String[] args) {Car car=new Audi();Car car2=new Byd();car.run();car2.run(); } }
類圖:
【采用簡單工廠模式】
/**** 簡單工廠模式:用來生產同一等級結構中的任意產品(對于增加的新的產品,需要修改已有代碼)* 工廠方法模式:用來生產同一等級結構中的固定產品(支持增加任意產品)* 抽象工廠模式:用來生產不同產品族中的全部產品(對于增加新的產品,無能為力。支持增加新的產品族)
* 采用簡單工廠模式的一個工廠,如果要增加新的子類如“紅旗”類,只能修改已有的代碼 ("return null") 做修改,但是違反開閉原則* */ package cn.sxt.pattern;public class Test_0423_Factory {public static Car createCar(String type) {if ("奧迪".equals(type)) {return new Audi(); }else if ("比亞迪".equals(type)) {return new Byd(); }else {return null;} }//也可以采用這種方式去創建類對象所以也稱它為靜態方法 /* public static Car createAudi(){return new Audi();}public static Car createByd() {return new Byd(); }*/ }/**** 采用簡單工廠模式的情況下*/ package cn.sxt.pattern;public class Test_0423_Client02 {//調用者public static void main(String[] args) {Car car=Test_0423_Factory.createCar("奧迪");//不用直接與Audi類打交道,而是與工廠類打交道,通過調用方法new對象Car car2=Test_0423_Factory.createCar("比亞迪");car.run();car2.run(); } }
類圖:
2、工廠方法模式
【一個工廠方法接口和客戶類】
/**** 工廠方法模式:用來生產同一等級結構中的固定產品(支持增加任意產品)*/ package cn.sxt.pattern;public interface Test_0423_Factory2 {Car createCar(); }
/**** 采用工廠方法模式的情況下*/ package cn.sxt.pattern; public class Test_0423_Client03 {//調用者public static void main(String[] args) {Car car=new AudiFactory().createCar();Car car2=new BydFactory().createCar();//如果要造奔馳,那么直接增加benz.java和benzFactory.java,這樣不需要修改原有代碼,符合開閉原則。但是會增加代碼量 car.run();car2.run(); } }
【各種車型的工廠】
/*** "奧迪"專門的工廠*/ package cn.sxt.pattern;public class AudiFactory implements Test_0423_Factory2 {public Car createCar() {return new Audi();}}/**"比亞迪"專門的工廠* */ package cn.sxt.pattern;public class BydFactory implements Test_0423_Factory2 {public Car createCar() {return new Byd();}}
類圖:
3、抽象工廠模式
? ?用來生產不同產品族的全部產品
? ?抽象工廠模式是針對產品族的情況,在多個業務品種、業務分類時,通過抽象工廠模式產生需要的對象是個很好解決辦法。
【產品族】 一個產品族:發動機、座椅、輪胎
由 高級發動機、高級座椅、高級輪胎組成一個高級產品族 ,生成一個高端汽車;
由 低級發動機、低級座椅、低級輪胎組成一個低級產品族 ,生成一個低端汽車。
【一個產品族】
/**** "發動機"接口*/ package cn.sxt.abstractFactory;public interface Engine {void run();void start(); }class LuxuryEngine implements Engine{ //"好發動機"類 public void run() {System.out.println("轉的快!"); }public void start() {System.out.println("啟動快!"); } }class LowEngine implements Engine{ //"差發動機"類 public void run() {System.out.println("轉的慢!"); }public void start() {System.out.println("啟動慢!"); } }/**** "座椅"接口*/ package cn.sxt.abstractFactory;public interface Seat {void comfortable(); }class LuxurySeat implements Seat{ //"好座椅"類 public void comfortable() {System.out.println("坐著舒服!"); } }class LowSeat implements Seat{ //"差座椅"類 public void comfortable() {System.out.println("坐著難受!"); } }/**** "輪胎"接口*/ package cn.sxt.abstractFactory;public interface Tyre {void friction(); }class LuxuryTyre implements Tyre{ //"好輪胎"類 public void friction() {System.out.println("摩擦力大!"); } }class LowTyre implements Tyre{ //"差輪胎"類 public void friction() {System.out.println("摩擦力小!"); } }
【工廠類】
/**** "造汽車的工廠"接口*/ package cn.sxt.abstractFactory;public interface Test_0423_Factory03 {Engine createEngine();Seat createSeat();Tyre createTyre(); }/*** //造"高端汽車"的工廠*/ package cn.sxt.abstractFactory;public class LuxuryCarFactory implements Test_0423_Factory03{ public Engine createEngine() {return new LuxuryEngine();//返回好發動機的對象 }public Seat createSeat() {return new LuxurySeat();}public Tyre createTyre() {return new LuxuryTyre();} }/*** //造"低端汽車"的工廠*/ package cn.sxt.abstractFactory;public class LowCarFactory implements Test_0423_Factory03{ public Engine createEngine() {//返回差發動機的對象return new LowEngine();}public Seat createSeat() {return new LowSeat();}public Tyre createTyre() {return new LowTyre();} }
【一個客戶對象】
/**** 采用抽象工廠模式的情況下*/ package cn.sxt.abstractFactory;public class Test_0423_Client04 {//調用者public static void main(String[] args) {Test_0423_Factory03 factory=new LuxuryCarFactory();Engine engine=factory.createEngine();engine.run();engine.start();Test_0423_Factory03 factory2=new LowCarFactory();Tyre tyre=factory2.createTyre();tyre.friction();} }
【類圖】