一篇學(xué)會(huì)抽象工廠模式
本文轉(zhuǎn)載自微信公眾號(hào)「我好困啊」,作者mengxin。轉(zhuǎn)載本文請(qǐng)聯(lián)系我好困啊公眾號(hào)。
意圖
定義一個(gè)超級(jí)工廠,用于創(chuàng)建其他對(duì)應(yīng)產(chǎn)品工廠。該工廠又可看成其他各種工廠的工廠。
主要解決
解決接口選擇問題
關(guān)鍵代碼
在一個(gè)工廠內(nèi)聚合多個(gè)同類型的產(chǎn)品,然后定義超級(jí)工廠創(chuàng)建對(duì)應(yīng)工廠。
優(yōu)點(diǎn)
當(dāng)一個(gè)產(chǎn)品族中多個(gè)對(duì)象被設(shè)計(jì)成一起工作的時(shí)候,每次獲取都能保證獲取到同一類型的產(chǎn)品。
缺點(diǎn)
產(chǎn)品族擴(kuò)展非常困難,要增加一個(gè)系列的某一產(chǎn)品,對(duì)象過多。
使用場(chǎng)景
需要生成不同類型的產(chǎn)品族時(shí)。如:白貓,黑貓等它們可組成同一產(chǎn)品"貓"。而大狗,小狗等它們可組成同一產(chǎn)品“狗”,那么我們每次獲取都能保證獲取到的是同一類型的產(chǎn)品。獲取貓時(shí),可獲取里面的一整套的各種品種的貓。
具體實(shí)現(xiàn)
創(chuàng)建第一個(gè)產(chǎn)品族
- 1/**
- 2* 第一個(gè)產(chǎn)品,dog
- 3*/
- 4public interface Dog {
- 5
- 6 //設(shè)置dog公用跑的動(dòng)作
- 7 void run();
- 8}
其對(duì)應(yīng)的產(chǎn)品族對(duì)應(yīng)下的產(chǎn)品
Dog第一個(gè)產(chǎn)品
- 1/**
- 2* Dog 產(chǎn)品族-> 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第二個(gè)產(chǎn)品
- 1/**
- 2* Dog 產(chǎn)品族-> 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產(chǎn)品
- 1/**
- 2* 用于生成對(duì)應(yīng)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)建第二個(gè)產(chǎn)品族
- 1/**
- 2* 第二個(gè)產(chǎn)品cat
- 3*/
- 4public interface Cat {
- 5
- 6 //貓的公用動(dòng)作
- 7 void speak();
- 8}
其產(chǎn)品族對(duì)應(yīng)下的產(chǎn)品:
Cat第一個(gè)產(chǎn)品
- 1/**
- 2* Cat 產(chǎn)品族-> 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第二個(gè)產(chǎn)品
- 1/**
- 2* Cat 產(chǎn)品族-> 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* 用于生產(chǎn)對(duì)應(yīng)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)建超級(jí)工廠,生成對(duì)應(yīng)工廠
- 1/**
- 2 * 超級(jí)抽象工廠,用于創(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 * 用于生成對(duì)應(yīng)工廠的工具類
- 3 */
- 4public class FactoryProducer {
- 5
- 6 public static AnimeFactory getAnimeFactory(String type){
- 7 if ("CAT".equals(type.toUpperCase())){
- 8 //生成對(duì)應(yīng)貓的工廠
- 9 return new CatFactory();
- 10 }else if ("DOG".equals(type.toUpperCase())){
- 11 //生成對(duì)應(yīng)狗工廠
- 12 return new DogFactory();
- 13 }
- 14 return null;
- 15 }
- 16
- 17}
測(cè)試:
- 1/**
- 2 * 測(cè)試類
- 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}