让工厂美丽
每個(gè)名副其實(shí)的Java程序員都知道Factory Pattern 。 這是一種便捷,標(biāo)準(zhǔn)化的方法,它通過(guò)教一個(gè)組件如何捕魚(yú)而不是將它們交給它們來(lái)減少耦合。 但是,在使用大型系統(tǒng)時(shí),該模式確實(shí)會(huì)向系統(tǒng)添加大量樣板代碼。 對(duì)于每個(gè)實(shí)體,您都需要許多不同的工廠來(lái)產(chǎn)生該實(shí)體的不同實(shí)現(xiàn),這既麻煩又不需要編寫(xiě)。 這只是我們?cè)赟peedment中使用的許多新模式之一 。
這是一個(gè)典型的示例,您希望汽車(chē)商人能夠在不知道確切實(shí)現(xiàn)的情況下創(chuàng)建Car接口的實(shí)例。
汽車(chē).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);...您可能尚未注意到的一件事是,大多數(shù)這些組件在Java 8及更高版本中都是多余的。 由于工廠接口可能被視為@FunctionalInterface我們不需要工廠,因此我們只需指定實(shí)現(xiàn)類(lèi)的構(gòu)造函數(shù)作為方法參考即可!
汽車(chē).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);...注意,實(shí)現(xiàn)類(lèi)Volvo和Tesla不需要更改。 這兩個(gè)工廠現(xiàn)在都可以拆除了,剩下的就是更為具體的系統(tǒng)!
(對(duì)于像這樣的簡(jiǎn)單示例,根本不需要工廠接口。您也可以使CarTrader接受Function<Color , Car> 。為工廠指定接口的優(yōu)勢(shì)在于,兩者都更容易實(shí)現(xiàn)理解,它允許您更改構(gòu)造函數(shù)的參數(shù),而無(wú)需更改使用工廠的代碼。)
翻譯自: https://www.javacodegeeks.com/2016/02/make-factories-beautiful.html
總結(jié)
- 上一篇: linux for循环执行命令(linu
- 下一篇: esb 和mq_使用保险丝结构管理MQ和