一篇學會抽象工廠模式
本文轉載自微信公眾號「我好困啊」,作者mengxin。轉載本文請聯(lián)系我好困啊公眾號。
意圖
定義一個超級工廠,用于創(chuàng)建其他對應產品工廠。該工廠又可看成其他各種工廠的工廠。
主要解決
解決接口選擇問題
關鍵代碼
在一個工廠內聚合多個同類型的產品,然后定義超級工廠創(chuàng)建對應工廠。
優(yōu)點
當一個產品族中多個對象被設計成一起工作的時候,每次獲取都能保證獲取到同一類型的產品。
缺點
產品族擴展非常困難,要增加一個系列的某一產品,對象過多。
使用場景
需要生成不同類型的產品族時。如:白貓,黑貓等它們可組成同一產品"貓"。而大狗,小狗等它們可組成同一產品“狗”,那么我們每次獲取都能保證獲取到的是同一類型的產品。獲取貓時,可獲取里面的一整套的各種品種的貓。
具體實現(xiàn)
創(chuàng)建第一個產品族
- 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}
 
創(chuàng)建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}
 
創(chuàng)建第二個產品族
- 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}
 
創(chuàng)建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}
 
最后創(chuàng)建超級工廠,生成對應工廠
- 1/**
 - 2 * 超級抽象工廠,用于創(chuàng)建其他工廠
 - 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}
 















 
 
 










 
 
 
 