设计模式【2.2】-- 工厂模式怎么演变成抽象工厂模式?
還記得之前的工廠方法模式么?現在老板更加富有了,除了水果,還準備搞點其他的生意,再做點服裝生意。水果工廠和服裝工廠明顯就不是同一種東西,肯定不能放到一個工廠里面生產,服裝也有好幾種,但是不同的工廠,也是老板自己的,老板希望能夠把握大局,所以不同工廠,肯定是有同一個特征的,也就是他們都是工廠,并且都是老板的。
先來創建一個接口Fruit.java:
public interface Fruit {public void print(); }創建水果的實體類Apple.java:
public class Apple implements Fruit{@Overridepublic void print() {System.out.println("蘋果產品生產出來了");} }Pear.java:
public class Pear implements Fruit{@Overridepublic void print() {System.out.println("雪梨產品生產出來了");} }除了水果產品,我們還有服裝產品,因此先創建一個Clothes.java:
public interface Clothes {public void process(); }服裝廠有哪些產品呢?先生產兩種Jeans.java:
public class Jeans implements Clothes{@Overridepublic void process() {System.out.println("牛仔褲生產出來了");} }Dresses.java:
public class Dresses implements Clothes{@Overridepublic void process() {System.out.println("連衣裙生產出來了");} }既然也要生產水果產品,也要生產服裝產品,那就先搞個抽閑工廠AbstractFactory.java,有兩個方法,一個生產水果產品,一個生產服裝產品:
public abstract class AbstractFactory {// 生產水果public abstract Fruit getFruit(String name);// 生產衣服public abstract Clothes getClothes(String name); }上面只是工廠的大致模型,但是每一種工廠都有自己的特點,所以水果工廠FruitFactory.java要自己實現生產水果產品的過程:
public class FruitFactory extends AbstractFactory{@Overridepublic Fruit getFruit(String name) {if(name==null){return null;}if("Apple".equalsIgnoreCase(name)){return new Apple();}else if("Pear".equalsIgnoreCase(name)){return new Pear();}return null;}@Overridepublic Clothes getClothes(String name) {return null;} }同樣,衣服工廠ClothesFactory.java也要自己實現工廠的具體生產過程:
public class ClothesFactory extends AbstractFactory {@Overridepublic Fruit getFruit(String name) {return null;}@Overridepublic Clothes getClothes(String name) {if (name == null) {return null;}if ("Jeans".equalsIgnoreCase(name)) {return new Jeans();} else if ("Dresses".equalsIgnoreCase(name)) {return new Dresses();}return null;} }不同的工廠怎么管理呢?需要一個工廠創造器FactoryProducer.java,把不同的工廠造出來,也可以理解成為工廠的工廠:
public class FactoryProducer {public static AbstractFactory getFactory(String type) {if (type == null) {return null;}if ("Fruit".equalsIgnoreCase(type)) {return new FruitFactory();} else if ("Clothes".equalsIgnoreCase(type)) {return new ClothesFactory();}return null;} }測試代碼FactoryTest.java:
public class FactoryTest {public static void main(String[] args) {AbstractFactory fruitFactory = FactoryProducer.getFactory("Fruit");Fruit apple = fruitFactory.getFruit("apple");apple.print();Fruit pear = fruitFactory.getFruit("pear");pear.print();AbstractFactory clothesFactory = FactoryProducer.getFactory("Clothes");Clothes jeans = clothesFactory.getClothes("jeans");jeans.process();Clothes dresses = clothesFactory.getClothes("Dresses");dresses.process();} }測試結果如下:
蘋果產品生產出來了 雪梨產品生產出來了 牛仔褲生產出來了 連衣裙生產出來了抽象工廠模式,本質上也是工廠模式,也是屬于創建型模式,用于創建對象。其特點是用一個超級工廠創建其他的工廠,也就是工廠的工廠。每一個工廠管理一類的產品,比如水果工廠主要負責生產水果產品,服裝工廠服裝生產服裝產品。而每一種工廠本質上都是工廠,都從抽象工廠中衍生出來,只是做了不同的實現。
- 優點:如果需要增加其他的工廠,容易拓展,增加工廠中的產品,也可以拓展。不需要關心創建的細節,相同的類型產品放置在一起創建。
- 缺點:增加了抽象的復雜度,理解難度增加。
【作者簡介】:
秦懷,公眾號【秦懷雜貨店】作者,技術之路不在一時,山高水長,縱使緩慢,馳而不息。個人寫作方向:Java源碼解析,JDBC,Mybatis,Spring,redis,分布式,劍指Offer,LeetCode等,認真寫好每一篇文章,不喜歡標題黨,不喜歡花里胡哨,大多寫系列文章,不能保證我寫的都完全正確,但是我保證所寫的均經過實踐或者查找資料。遺漏或者錯誤之處,還望指正。
2020年我寫了什么?
開源編程筆記
平日時間寶貴,只能使用晚上以及周末時間學習寫作,關注我,我們一起成長吧~
總結
以上是生活随笔為你收集整理的设计模式【2.2】-- 工厂模式怎么演变成抽象工厂模式?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaSE基础知识
- 下一篇: asp.net ajax控件工具集 Au