您好,登錄后才能下訂單哦!
上一篇說到了工廠模式,那么學習了工廠模式,抽象工廠也得學習一下。實際上,抽象工廠模式實際上就是在工廠模式的基礎上再嵌套一層工廠模式而已,通過父工廠制造子工廠。只是,也并不完全是嵌套一層,各個工廠會被抽象成一個集多個工廠共同點的抽象類。通過工廠制造器,創建出該抽象工廠的子類。
好比如說,一個博客頁面有個換膚系統。那么假如有兩套風格,黑和白。那么,我選擇了黑色風格的,實際這步就相當通過換膚系統這個工廠制造器,創建出一個黑色主題的工廠,該黑色主題的工廠內可以生產各種黑色風格的產品,比如黑色頭像掛飾,黑色背景,黑色的xxx等,然后通過這些黑色主題產品完成了整個換膚操作。白色主題也如此。
好吧,上次以水果工廠作為一個類,那么這次要創建一個蔬菜工廠,水果和蔬菜這兩類都屬于種植物,那么我們就可以根據這一共同點抽象出一個種植物抽象類,即種植物工廠。
首先,創建產品類,包括上次的水果,和現在的蔬菜,他們都實現了水果類接口和蔬菜類接口:
水果系列:
public interface Fruit { void printInfo(); }
public class Apple implements Fruit{ @Override public void printInfo() { // TODO Auto-generated method stub System.out.println("蘋果"); } }
public class Banana implements Fruit{ @Override public void printInfo() { // TODO Auto-generated method stub System.out.println("香蕉"); } }
public class Orange implements Fruit{ @Override public void printInfo() { // TODO Auto-generated method stub System.out.println("橙子"); } }
接著是蔬菜系列:
public interface Vegetable { public void printInfo(); }
public class Tomato implements Vegetable{ @Override public void printInfo() { // TODO Auto-generated method stub System.out.println("西紅柿"); } }
public class Cabbage implements Vegetable{ @Override public void printInfo() { // TODO Auto-generated method stub System.out.println("白菜"); } }
public class Eggplant implements Vegetable{ @Override public void printInfo() { // TODO Auto-generated method stub System.out.println("茄子"); } }
然后,是它們各自的工廠類:
水果工廠:
public class FruitFactory extends PlantFactory{ public static final int APPLE=1; public static final int BANANA=2; public static final int ORANGE=3; @Override public Fruit getFruit(int fruitType){ if(fruitType==APPLE){ return new Apple(); } if(fruitType==BANANA){ return new Banana(); } if(fruitType==ORANGE){ return new Orange(); } return null; } @Override Vegetable getVegetable(int vegetableType) { // TODO Auto-generated method stub return null; } }
蔬菜工廠:
public class VegetableFactory extends PlantFactory { public static final int CABBAGE=1; public static final int TOMATO=2; public static final int EGGPLANT=3; @Override Fruit getFruit(int fruitType) { // TODO Auto-generated method stub return null; } @Override public Vegetable getVegetable(int vegetableType) { // TODO Auto-generated method stub if(vegetableType==CABBAGE){ return new Cabbage(); } if(vegetableType==TOMATO){ return new Tomato(); } if(vegetableType==EGGPLANT){ return new Eggplant(); } return null; } }
可以看到,它們都是屬于種植物這一類,所以都是繼承了種植工廠類
public abstract class PlantFactory { abstract Fruit getFruit(int fruitType); abstract Vegetable getVegetable(int vegetableType); }
最后,提供一個工廠生產器,即生產工廠的工廠:
public class Plantation { public static final int FRUIT=1; public static final int VEGETABLE=2; public static PlantFactory getFactory(int factoryType){ if(factoryType==FRUIT){ return new FruitFactory(); } if(factoryType==VEGETABLE){ return new VegetableFactory(); } return null; } }
好吧,寫個main測試下:
public static void main(String[] args) { // TODO Auto-generated method stub FruitFactory fruitFactory=(FruitFactory)Plantation.getFactory(Plantation.FRUIT); Apple apple=(Apple) fruitFactory.getFruit(FruitFactory.APPLE); apple.printInfo(); VegetableFactory vegetableFactory=(VegetableFactory)Plantation.getFactory(Plantation.VEGETABLE); Tomato tomato=(Tomato) vegetableFactory.getVegetable(VegetableFactory.TOMATO); tomato.printInfo(); }
結果:
蘋果 西紅柿
雖然工廠設計模式在獲取產品類時很方便,但實際上產品的需求越嚴格,那么內部系統則越發龐大復雜,對于生產一些小產品來說,使用這么復雜龐大的系統反而浪費資源。
總結
以上就是本文關于Java設計模式筆記之抽象工廠代碼示例的全部內容。代碼是一個人主觀意志的客觀反映。。。胡扯了,參考別人寫的代碼,另外,多看看源碼也是有好處的,學習別人實現某個功能的設計思路,來提高自己的編程水平。歡迎參閱:Java多線程之線程通信生產者消費者模式及等待喚醒機制代碼詳解、Java單例模式實現靜態內部類方法示例等,有什么問題可以隨時留言,歡迎大家交流討論。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。