一篇學會抽象工廠模式
本文轉載自微信公眾號「我好困啊」,作者mengxin。轉載本文請聯系我好困啊公眾號。
意圖
定義一個超級工廠,用于創建其他對應產品工廠。該工廠又可看成其他各種工廠的工廠。
主要解決
解決接口選擇問題
關鍵代碼
在一個工廠內聚合多個同類型的產品,然后定義超級工廠創建對應工廠。
優點
當一個產品族中多個對象被設計成一起工作的時候,每次獲取都能保證獲取到同一類型的產品。
缺點
產品族擴展非常困難,要增加一個系列的某一產品,對象過多。
使用場景
需要生成不同類型的產品族時。如:白貓,黑貓等它們可組成同一產品"貓"。而大狗,小狗等它們可組成同一產品“狗”,那么我們每次獲取都能保證獲取到的是同一類型的產品。獲取貓時,可獲取里面的一整套的各種品種的貓。
具體實現
創建第一個產品族
- 1/**
- 2* 第一個產品,dog
- 3*/
- 4public interface Dog {
- 5
- 6 //設置dog公用跑的動作
- 7 void run();
- 8}
其對應的產品族對應下的產品
Dog第一個產品
- 1/**
- 2* Dog 產品族-> BigDog
- 3*/
- 4public class BigDog implements Dog{
- 5
- 6 @Override
- 7 public void run() {
- 8 System.out.println("The big dog runs fast...");
- 9 }
- 0}
Dog第二個產品
- 1/**
- 2* Dog 產品族-> SmallDog
- 3*/
- 4public class SmallDog implements Dog{
- 5
- 6 @Override
- 7 public void run() {
- 8 System.out.println("The small dog runs slow...");
- 9 }
- 0}
創建dog工廠用于生成dog產品
- 1/**
- 2* 用于生成對應Dog的工廠
- 3*/
- 4public class DogFactory extends AnimeFactory{
- 5
- 6
- 7 @Override
- 8 public Dog getDog(String size) {
- 9 if ("BIG".equals(size.toUpperCase())){
- 10 return new BigDog();
- 11 }else if ("SMALL".equals(size.toUpperCase())){
- 12 return new SmallDog();
- 13 }
- 14 return null;
- 15 }
- 16
- 17
- 18 @Override
- 19 public Cat getCat(String color) {
- 20 return null;
- 21 }
- 22}
創建第二個產品族
- 1/**
- 2* 第二個產品cat
- 3*/
- 4public interface Cat {
- 5
- 6 //貓的公用動作
- 7 void speak();
- 8}
其產品族對應下的產品:
Cat第一個產品
- 1/**
- 2* Cat 產品族-> BlackCat
- 3*/
- 4public class BlackCat implements Cat{
- 5
- 6 @Override
- 7 public void speak() {
- 8 System.out.println("Black cat speak miaomiaomiao");
- 9 }
- 0}
Cat第二個產品
- 1/**
- 2* Cat 產品族-> WhiteCat
- 3*/
- 4public class WhiteCat implements Cat{
- 5
- 6 @Override
- 7 public void speak() {
- 8 System.out.println("White cat speak miaomiaomiao");
- 9 }
- 0}
創建Cat工廠,用于生成cat
- 1/**
- 2* 用于生產對應Cat的工廠
- 3*/
- 4public class CatFactory extends AnimeFactory{
- 5
- 6 @Override
- 7 public Dog getDog(String size) {
- 8 return null;
- 9 }
- 10
- 11 @Override
- 12 public Cat getCat(String color) {
- 13 if ("WHITE".equals(color.toUpperCase())){
- 14 return new WhiteCat();
- 15 }else if ("BLACK".equals(color.toUpperCase())){
- 16 return new BlackCat();
- 17 }
- 18 return null;
- 19 }
- 20}
最后創建超級工廠,生成對應工廠
- 1/**
- 2 * 超級抽象工廠,用于創建其他工廠
- 3 */
- 4public abstract class AnimeFactory {
- 5
- 6 public abstract Dog getDog(String size);
- 7
- 8 public abstract Cat getCat(String color);
- 9
- 0}
- 1/**
- 2 * 用于生成對應工廠的工具類
- 3 */
- 4public class FactoryProducer {
- 5
- 6 public static AnimeFactory getAnimeFactory(String type){
- 7 if ("CAT".equals(type.toUpperCase())){
- 8 //生成對應貓的工廠
- 9 return new CatFactory();
- 10 }else if ("DOG".equals(type.toUpperCase())){
- 11 //生成對應狗工廠
- 12 return new DogFactory();
- 13 }
- 14 return null;
- 15 }
- 16
- 17}
測試:
- 1/**
- 2 * 測試類
- 3 */
- 4public class Test {
- 5
- 6 public static void main(String[] args) {
- 7 //獲取貓工廠
- 8 AnimeFactory factory = FactoryProducer.getAnimeFactory("cat");
- 9 Cat cat = factory.getCat("Black");
- 10 cat.speak();
- 11
- 12 //獲取狗工廠
- 13 factory = FactoryProducer.getAnimeFactory("dog");
- 14 Dog dog = factory.getDog("Big");
- 15 dog.run();
- 16 }
- 17
- 18}