基于SpringBoot设计模式之创建型设计模式·抽象工厂模式

基于SpringBoot设计模式之创建型设计模式·抽象工厂模式

码农世界 2024-05-14 前端 61 次浏览 0个评论

文章目录

  • 介绍
  • 开始
    • 架构图(以穿搭举例)
    • 样例一(html关于列表和表格的应用)
      • 定义抽象工厂(html)
      • 定义抽象工厂需要制作抽象产物(托盘)
      • 定义具体工厂(列表、表格)
      • 定义工厂生产零件(托盘)
      • 样例二(衣服关于春季和夏季的穿搭)
        • 定义抽象工厂(穿搭)
        • 定义抽象工厂需要制作抽象产物(上衣、下装)
        • 定义具体工厂(春季、夏季)
        • 定义工厂生产零件(上衣、下装)
        • 样例三(工厂关于小米和华为的生产)
          • 定义抽象工厂(制造工厂)
          • 定义抽象工厂需要制作抽象产物(手机、路由器)
          • 定义具体工厂(小米工厂、华为工厂)
          • 定义工厂生产零件(手机、路由器)
          • 测试样例
          • 总结

            介绍

              在抽象工厂模式中,不仅有抽象工厂,还有抽象零件,抽象产品。其中抽象工厂主要的工作职责将抽象零件组装成抽象产品。

              第一大段,这么多抽象,抽象的含义到底是啥?它指:不考虑具体怎样实现,而是仅关注接口(API)的状态。

              综上所诉:在 Abstract Factory 模式中将会出现抽象工厂,它会将抽象零件组装为抽象产品。也就是说,

              我们并不关心零件的具体实现,而是只关心接口(API)。我们仅使用该接口(API)将零件组装成为产品。

            开始

            架构图(以穿搭举例)

              抽象工厂作为主接口,不具备任何含义,只记录有上衣和下装。在季节工厂里面(也可以叫做季节产品),他们生产了一系列相应季节的上衣和下装。但对上衣和下装同时是比较抽象的,需要对上衣和下装(也可以叫做零件)赋予真正的含义,如:在上衣中有短袖、衬衫;在下装中,有牛仔裤和短裤。

              通过具体的零件,才有了品牌打出了季节产品,最后统称抽象为上衣、下装。

            样例一(html关于列表和表格的应用)

            定义抽象工厂(html)

            public interface HtmlFactory {
                /**
                 * 创建一个抽象托盘
                 *
                 * @return
                 */
                TrayService createTray();
            }
            

            定义抽象工厂需要制作抽象产物(托盘)

              为什么要单独定义一个item接口,是因为对于html代码,我们的产物有标签,标签等,最后都是需要一个html的模板所以,定义了一个item接口,让后续的抽象产物继承。

            public interface Item {
                /**
                 * 生成 html 代码
                 */
                String makeHTML();
            }
            
            public interface TrayService extends Item {
            }
            

            定义具体工厂(列表、表格)

            @Service
            @Slf4j
            public class ListHtmlFactory implements HtmlFactory {
                @Resource(name = "listTrayServiceImpl")
                private TrayService trayService;
                @Override
                public TrayService createTray() {
                    return trayService;
                }
            }
            
            @Service
            @Slf4j
            public class TableHtmlFactory implements HtmlFactory {
                @Resource(name = "tableTrayServiceImpl")
                private TrayService trayService;
                @Override
                public TrayService createTray() {
                    return trayService;
                }
            }
            

            定义工厂生产零件(托盘)

            @Service
            @Slf4j
            public class ListTrayServiceImpl implements TrayService {
                @Override
                public String makeHTML() {
                    return "
              \n" + "
            • 咖啡
            • \n" + "
            • \n" + "
            • 牛奶
            • \n" + "
            "; } }
            @Service
            @Slf4j
            public class TableTrayServiceImpl implements TrayService {
                @Override
                public String makeHTML() {
                    return "\n" +
                            "  \n" +
                            "    \n" +
                            "    \n" +
                            "  \n" +
                            "  \n" +
                            "    \n" +
                            "    \n" +
                            "  \n" +
                            "  \n" +
                            "    \n" +
                            "    \n" +
                            "  \n" +
                            "
            月份储蓄
            一月¥3400
            二月¥4500
            "; } }

            样例二(衣服关于春季和夏季的穿搭)

            定义抽象工厂(穿搭)

            public interface WearFactory {
                /**
                 * 创建一个 衣服
                 *
                 * @return
                 */
                ClothesService createClothe();
                /**
                 * 创建一个 裤子
                 *
                 * @return
                 */
                TrousersService createTrouser();
            }
            

            定义抽象工厂需要制作抽象产物(上衣、下装)

            public interface ClothesService {
                /**
                 * 短袖
                 */
                void shortSleeve();
                /**
                 * 衬衫
                 */
                void shirt();
            }
            
            public interface TrousersService {
                /**
                 * 牛仔裤
                 */
                void jeans();
                /**
                 * 短裤
                 */
                void shorts();
            }
            

            定义具体工厂(春季、夏季)

            @Service
            @Slf4j
            public class SpringWearFactory implements WearFactory {
                @Resource(name = "springClothesServiceImpl")
                private ClothesService clothesService;
                @Resource(name = "springTrousersServiceImpl")
                private TrousersService trousersService;
                @Override
                public ClothesService createClothe() {
                    return clothesService;
                }
                @Override
                public TrousersService createTrouser() {
                    return trousersService;
                }
            }
            
            @Service
            @Slf4j
            public class SummerWearFactory implements WearFactory {
                @Resource(name = "summerClothesServiceImpl")
                private ClothesService clothesService;
                @Resource(name = "summerTrousersServiceImpl")
                private TrousersService trousersService;
                @Override
                public ClothesService createClothe() {
                    return clothesService;
                }
                @Override
                public TrousersService createTrouser() {
                    return trousersService;
                }
            }
            

            定义工厂生产零件(上衣、下装)

            @Service
            @Slf4j
            public class SpringClothesServiceImpl implements ClothesService {
                @Override
                public void shortSleeve() {
                    System.out.println("制作了---春季款---短袖");
                }
                @Override
                public void shirt() {
                    System.out.println("制作了---春季款---衬衫");
                }
            }
            
            @Service
            @Slf4j
            public class SpringTrousersServiceImpl implements TrousersService {
                @Override
                public void jeans() {
                    System.out.println("制作了---春季款---牛仔裤");
                }
                @Override
                public void shorts() {
                    System.out.println("制作了---春季款---短裤");
                }
            }
            
            @Service
            @Slf4j
            public class SummerClothesServiceImpl implements ClothesService {
                
                @Override
                public void shortSleeve() {
                    System.out.println("制作了---夏季款---短袖");
                }
                @Override
                public void shirt() {
                    System.out.println("制作了---夏季款---衬衫");
                }
                
                
            }
            
            @Service
            @Slf4j
            public class SummerTrousersServiceImpl implements TrousersService {
                @Override
                public void jeans() {
                    System.out.println("制作了---夏季款---牛仔裤");
                }
                @Override
                public void shorts() {
                    System.out.println("制作了---夏季款---短裤");
                }
                
            }
            

            样例三(工厂关于小米和华为的生产)

            定义抽象工厂(制造工厂)

            public interface ProductFactory {
                /**
                 * 创建一个抽象手机
                 *
                 * @return
                 */
                PhoneService createPhone();
                /**
                 * 创建一个抽象路由器
                 *
                 * @return
                 */
                RouterService createRouter();
            }
            

            定义抽象工厂需要制作抽象产物(手机、路由器)

            public interface PhoneService {
                /**
                 * 开机
                 */
                void power();
                /**
                 * 关机
                 */
                void shutdown();
                /**
                 * 打电话
                 */
                void call();
            }
            
            public interface RouterService {
                /**
                 * 开机
                 */
                void power();
                /**
                 * 关机
                 */
                void shutdown();
                /**
                 * 路由器 设置
                 */
                void setting();
            }
            

            定义具体工厂(小米工厂、华为工厂)

            @Service
            @Slf4j
            public class XiaomiProductFactory implements ProductFactory {
                @Resource(name = "xiaomiPhoneServiceImpl")
                private PhoneService phoneService;
                @Resource(name = "xiaomiRouterServiceImpl")
                private RouterService routerService;
                @Override
                public PhoneService createPhone() {
                    return phoneService;
                }
                @Override
                public RouterService createRouter() {
                    return routerService;
                }
            }
            
            @Service
            @Slf4j
            public class HuaweiProductFactory implements ProductFactory {
                @Resource(name = "huaweiPhoneServiceImpl")
                private PhoneService phoneService;
                @Resource(name = "huaweiRouterServiceImpl")
                private RouterService routerService;
                @Override
                public PhoneService createPhone() {
                    return phoneService;
                }
                @Override
                public RouterService createRouter() {
                    return routerService;
                }
            }
            

            定义工厂生产零件(手机、路由器)

            @Service
            @Slf4j
            public class XiaomiPhoneServiceImpl implements PhoneService {
                @Override
                public void power() {
                    System.out.println("小米手机开机");
                }
                @Override
                public void shutdown() {
                    System.out.println("小米手机关机");
                }
                @Override
                public void call() {
                    System.out.println("小米手机打电话");
                }
            }
            
            @Service
            @Slf4j
            public class XiaomiRouterServiceImpl implements RouterService {
                @Override
                public void power() {
                    System.out.println("小米路由器开机");
                }
                @Override
                public void shutdown() {
                    System.out.println("小米路由器关机");
                }
                @Override
                public void setting() {
                    System.out.println("小米路由器开始设置wifi");
                }
            }
            
            @Service
            @Slf4j
            public class HuaweiPhoneServiceImpl implements PhoneService {
                @Override
                public void power() {
                    System.out.println("华为手机开机");
                }
                @Override
                public void shutdown() {
                    System.out.println("华为手机关机");
                }
                @Override
                public void call() {
                    System.out.println("华为手机打电话");
                }
            }
            
            @Service
            @Slf4j
            public class HuaweiRouterServiceImpl implements RouterService {
                @Override
                public void power() {
                    System.out.println("华为路由器开机");
                }
                @Override
                public void shutdown() {
                    System.out.println("华为路由器关机");
                }
                @Override
                public void setting() {
                    System.out.println("华为路由器开始设置wifi");
                }
            }
            

            测试样例

            @Slf4j
            @SpringBootTest(classes = AbstractFactoryApplication.class)
            public class TestAbstractFactory {
                @Resource
                private Map htmlFactoryMap;
                @Resource
                private Map productFactoryMap;
                @Resource
                private Map wearFactoryMap;
                @Test
                public void testPage() {
                    for (Map.Entry map : htmlFactoryMap.entrySet()) {
                        log.info("这是 : {} 工厂", map.getKey());
                        System.out.println(map.getValue().createTray().makeHTML());
                    }
                }
                @Test
                public void testProduct() {
                    for (Map.Entry map : productFactoryMap.entrySet()) {
                        log.info("这是 : {} 工厂", map.getKey());
                        ProductFactory value = map.getValue();
                        PhoneService phone = value.createPhone();
                        RouterService router = value.createRouter();
                        log.info("phone begin");
                        phone.power();phone.call();phone.shutdown();
                        log.info("router begin");
                        router.power();router.setting();router.shutdown();
                    }
                }
                @Test
                public void testWear() {
                    for (Map.Entry map : wearFactoryMap.entrySet()) {
                        log.info("这是 : {} 工厂", map.getKey());
                        WearFactory value = map.getValue();
                        ClothesService clothe = value.createClothe();
                        TrousersService trouser = value.createTrouser();
                        log.info("clothe begin");
                        clothe.shortSleeve();clothe.shirt();
                        log.info("trouser begin");
                        trouser.jeans();trouser.shorts();
                    }
                }
            }
            

            总结

              如果现在要建立一个工厂是非常容易能创建的,但如果要增加新的零件每个工厂都要实现零件制作方法,因此非常麻烦。

              一句话表述:易于增加具体的工厂,难以增加新的零件

转载请注明来自码农世界,本文标题:《基于SpringBoot设计模式之创建型设计模式·抽象工厂模式》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,61人围观)参与讨论

还没有评论,来说两句吧...

Top