迅為RK3399開發板嵌入式linux開發指南
阿新 • • 發佈:2021-07-21
工廠模式
概述
在父類中提供一個建立物件的方法,允許子類決定例項化物件的型別。
使用場景
假設一家汽車製造公司,一直在使用一套程式生產比亞迪型號的汽車,現在出現了大批量的特斯拉汽車的訂單,如果在原來的程式上進行修改的話就會違反開閉原則,同時如果後期又多了其他品牌的訂單,則再原程式上修改顯得不現實。
解決方法
該公司分開出來兩個製造工廠,BYDFactory和TeslaFactory,去分別製造該型別的汽車。公司接到訂單後,只需要派給不同的公司即可。
實現
// 抽象工廠類介面 public interface CarFactory { public Car produce(); } // 抽象產品類介面 // public interface Car { String show(); } // 特斯拉工廠 public class TeslaFactory implements CarFactory{ @Override public Car produce() { // 只生產特斯拉 return new TeslaCar(); } } // 比亞迪工廠 public class BYDFactory implements CarFactory{ @Override public Car produce() { // 只生產比亞迪 return new BYDCar(); } } // 比亞迪汽車 public class BYDCar implements Car{ @Override public String show() { return "Build Your Dream"; } } // 特斯拉汽車 public class TeslaCar implements Car{ @Override public String show() { return "Go Electric"; } } // 製造汽車 public class Client { public static void main(String[] args) { // 不關心建立過程,只關心呼叫者是誰 Car car = new BYDFactory().produce(); String show = car.show(); System.out.println(show); } }
總結
- 需要有抽象工廠類和抽象產品類,工廠類生產各自的產品。
- 遵循開閉原則,不會對原程式進行修改。
- 單一功能指責,每個工廠的職責互不影響,比如特斯拉制造的四驅系統,比亞迪製造後驅系統。
- 缺點就是可能隨著品牌增多,導致具體工廠類和具體產品類數量變多。
抽象工廠模式
概述
能建立一系列相關物件,而不需要制定具體類。
使用場景
電腦組裝廠要組裝聯想和戴爾品牌的電腦,兩種品牌的電腦採用的CPU、記憶體、硬碟都是不一樣的廠家,如果不區分使用一套程式去製造非常困難,而且後期CPU換了型號,還要對應用程式大動手腳。
解決方法
應當採用抽象工廠模式,抽象出一條整鏈的原材料,如果後期修改的話對於上一層呼叫的地方不用修改,只需要修改具體工廠的方法。比如聯想將CPU換為AMD只需要修改聯想廠家的方法。
實現
// 抽象工廠 public interface ComputerFactory { CPU createCpu(); Memory createMemory(); } // 抽象產品 public interface CPU { void work(); } public interface Memory { default void work() { System.out.println("預設記憶體"); } } // 具體產品 public class IntelCpu implements CPU{ @Override public void work() { System.out.println("intel CPU"); } } public class AppleCpu implements CPU{ @Override public void work() { System.out.println("apple cpu"); } } // 具體工廠 public class DellFactory implements ComputerFactory { // apple cpu @Override public CPU createCpu() { return new AppleCpu(); } @Override public Memory createMemory() { return new Memory() { }; } } public class LenovoFactory implements ComputerFactory { // intel cpu @Override public CPU createCpu() { return new IntelCpu(); } @Override public Memory createMemory() { return new Memory() { }; } } public class Client { public static void main(String[] args) { // 抽象工廠可以生產不同具體類一系列產品 DellFactory factory = new DellFactory(); factory.createCpu().work(); factory.createMemory().work(); } }
總結
- 與普通工廠模式的區別就是每一個工廠不是建立單個物件,而是建立多個物件。