让工厂美丽
每個名副其實的Java程序員都知道Factory Pattern 。 這是一種便捷,標準化的方法,它通過教一個組件如何捕魚而不是將它們交給它們來減少耦合。 但是,在使用大型系統時,該模式確實會向系統添加大量樣板代碼。 對于每個實體,您都需要許多不同的工廠來產生該實體的不同實現,這既麻煩又不需要編寫。 這只是我們在Speedment中使用的許多新模式之一 。
這是一個典型的示例,您希望汽車商人能夠在不知道確切實現的情況下創建Car接口的實例。
汽車.java
public abstract class Car {private final Color color;public interface Factory {Car make(Color color);}protected Car(Color color) {this.color = color;}public abstract String getModel();public abstract int getPrice(); }沃爾沃
public final class Volvo extends Car {public Volvo(Color color) {super(color);}public String getModel() { return "Volvo"; }public int getPrice() { return 10_000; } // USD }特斯拉
public final class Tesla extends Car {public Tesla(Color color) {super(color);}public String getModel() { return "Tesla"; }public int getPrice() { return 86_000; } // USD }VolvoFactory.java
public final class VolvoFactory implements Car.Factory {public Car make(Color color) { return new Volvo(color); } }TeslaFactory.java
public final class TeslaFactory implements Car.Factory {public Car make(Color color) { return new Tesla(color); } }CarTrader.java
public final class CarTrader {private Car.Factory factory;private int cash;public void setSupplier(Car.Factory factory) {this.factory = factory;}public Car buyCar(Color color) {final Car car = factory.make(color);cash += car.getPrice();return car;} }Main.java
...final CarTrader trader = new CarTrader();trader.setSupplier(new VolvoFactory());final Car a = trader.buyCar(Color.BLACK);final Car b = trader.buyCar(Color.RED);trader.setSupplier(new TeslaFactory());final Car c = trader.buyCar(Color.WHITE);...您可能尚未注意到的一件事是,大多數這些組件在Java 8及更高版本中都是多余的。 由于工廠接口可能被視為@FunctionalInterface我們不需要工廠,因此我們只需指定實現類的構造函數作為方法參考即可!
汽車.java
public abstract class Car {private final Color color;@FunctionalInterfacepublic interface Factory {Car make(Color color);} }Main.java
...trader.setSupplier(Volvo::new);trader.setSupplier(Tesla::new);...注意,實現類Volvo和Tesla不需要更改。 這兩個工廠現在都可以拆除了,剩下的就是更為具體的系統!
(對于像這樣的簡單示例,根本不需要工廠接口。您也可以使CarTrader接受Function<Color , Car> 。為工廠指定接口的優勢在于,兩者都更容易實現理解,它允許您更改構造函數的參數,而無需更改使用工廠的代碼。)
翻譯自: https://www.javacodegeeks.com/2016/02/make-factories-beautiful.html
總結
- 上一篇: linux for循环执行命令(linu
- 下一篇: esb 和mq_使用保险丝结构管理MQ和