• 【设计模式】抽象工厂模式


    抽象工厂模式介绍

    抽象工厂模式:模式介绍

    抽象工厂模式和工厂方法模式区别为: 工厂方法模式的工厂只能创建单一产品,抽象工厂模式的工厂可以创建多个产品(一类产品即产品簇)。此示例中,分别有两个具体工厂,分别为现代风格家具工厂和维多利亚风格家具工厂。现代风格家具工厂可以生产多种现代风格的家具,分别为现代风格的椅子、沙发、咖啡桌;维多利亚风格家具工厂可以生产多种维多利亚风格家具,分别为维多利亚风格的椅子、沙发、咖啡桌。

    模式代码实现

    产品

    Chair

    chair/Chair.java

    package abstract_factory.chair;
    
    /**
     * 椅子接口
     */
    public interface Chair {
        void hasLeg();
    }
    

    chair/ModernChair.java

    package abstract_factory.chair;
    
    /**
     * 现代风格椅子
     */
    public class ModernChair implements Chair {
        @Override
        public void hasLeg() {
            System.out.println("Modern chair has no leg.");
        }
    }
    

    chair/VictoriaChair.java

    package abstract_factory.chair;
    
    /**
     * 维多利亚风格椅子
     */
    public class VictoriaChair implements Chair {
        @Override
        public void hasLeg() {
            System.out.println("Victoria chair has leg.");
        }
    }
    

    Sofa

    sofa/Sofa.java

    package abstract_factory.sofa;
    
    /**
     * 沙发接口
     */
    public interface Sofa {
        void sitOn();
    }
    

    sofa/ModernSofa.java

    package abstract_factory.sofa;
    
    /**
     * 现代风格沙发
     */
    public class ModernSofa implements Sofa {
        @Override
        public void sitOn() {
            System.out.println("Modern sofa sit on.");
        }
    }
    

    sofa/VictoriaSofa.java

    package abstract_factory.sofa;
    
    /**
     * 维多利亚风格沙发
     */
    public class VictoriaSofa implements Sofa {
        @Override
        public void sitOn() {
            System.out.println("Victory sofa sit on.");
        }
    }
    

    Coffee Table

    coffee_table/CoffeeTable.java

    package abstract_factory.coffee_table;
    
    /**
     * 咖啡桌接口
     */
    public interface CoffeeTable {
        void putCoffee();
    }
    

    coffee_table/ModernCoffeeTable.java

    package abstract_factory.coffee_table;
    
    /**
     * 现代风格咖啡桌
     */
    public class ModernCoffeeTable implements CoffeeTable {
        @Override
        public void putCoffee() {
            System.out.println("Modern coffee table put coffee.");
        }
    }
    

    coffee_table/VictoriaCoffeeTable.java

    package abstract_factory.coffee_table;
    
    /**
     * 维多利亚风格咖啡桌
     */
    public class VictoriaCoffeeTable implements CoffeeTable {
        @Override
        public void putCoffee() {
            System.out.println("Victoria coffee table put coffee.");
        }
    }
    

    工厂

    factory/FurnitureFactory.java

    package abstract_factory.factory;
    
    import abstract_factory.chair.Chair;
    import abstract_factory.coffee_table.CoffeeTable;
    import abstract_factory.sofa.Sofa;
    
    /**
     * 抽象家具工厂
     */
    public interface FurnitureFactory {
        Chair createChair();
        CoffeeTable createCoffeeTable();
        Sofa createSofa();
    }
    

    factory/ModernFurnitureFactory.java

    package abstract_factory.factory;
    
    import abstract_factory.chair.Chair;
    import abstract_factory.chair.ModernChair;
    import abstract_factory.coffee_table.CoffeeTable;
    import abstract_factory.coffee_table.ModernCoffeeTable;
    import abstract_factory.factory.FurnitureFactory;
    import abstract_factory.sofa.ModernSofa;
    import abstract_factory.sofa.Sofa;
    
    /**
     * 现代风格家具工厂
     */
    public class ModernFurnitureFactory implements FurnitureFactory {
        @Override
        public Chair createChair() {
            return new ModernChair();
        }
    
        @Override
        public CoffeeTable createCoffeeTable() {
            return new ModernCoffeeTable();
        }
    
        @Override
        public Sofa createSofa() {
            return new ModernSofa();
        }
    }
    

    factory/VictoriaFurnitureFactory.java

    package abstract_factory.factory;
    
    import abstract_factory.chair.Chair;
    import abstract_factory.chair.VictoriaChair;
    import abstract_factory.coffee_table.CoffeeTable;
    import abstract_factory.coffee_table.VictoriaCoffeeTable;
    import abstract_factory.factory.FurnitureFactory;
    import abstract_factory.sofa.Sofa;
    import abstract_factory.sofa.VictoriaSofa;
    
    /**
     * 维多利亚风格家具工厂
     */
    public class VictoriaFurnitureFactory implements FurnitureFactory {
        @Override
        public Chair createChair() {
            return new VictoriaChair();
        }
    
        @Override
        public CoffeeTable createCoffeeTable() {
            return new VictoriaCoffeeTable();
        }
    
        @Override
        public Sofa createSofa() {
            return new VictoriaSofa();
        }
    }
    

    测试

    测试代码

    package abstract_factory;
    
    import abstract_factory.chair.Chair;
    import abstract_factory.coffee_table.CoffeeTable;
    import abstract_factory.factory.FurnitureFactory;
    import abstract_factory.factory.ModernFurnitureFactory;
    import abstract_factory.factory.VictoriaFurnitureFactory;
    import abstract_factory.sofa.Sofa;
    
    /**
     * 测试类
     */
    public class Main {
        public static void main(String[] args) {
            // 创建现代风格家具
            FurnitureFactory furnitureFactory1 = new ModernFurnitureFactory();
            Chair chair1 = furnitureFactory1.createChair();
            chair1.hasLeg();
            CoffeeTable coffeeTable1 = furnitureFactory1.createCoffeeTable();
            coffeeTable1.putCoffee();
            Sofa sofa1 = furnitureFactory1.createSofa();;
            sofa1.sitOn();
    
            // 创建维多利亚风格家具
            FurnitureFactory furnitureFactory2 = new VictoriaFurnitureFactory();
            Chair chair2 = furnitureFactory2.createChair();
            chair2.hasLeg();
            CoffeeTable coffeeTable2 = furnitureFactory2.createCoffeeTable();
            coffeeTable2.putCoffee();
            Sofa sofa2 = furnitureFactory2.createSofa();
            sofa2.sitOn();
        }
    }
    

    测试结果
    在这里插入图片描述

    参考

    [1] REFACTORING.GURU.抽象工厂模式

  • 相关阅读:
    一文进阶什么是负载均衡,通俗易懂的全文解析
    东北林业大学计算机考研资料汇总
    服务框架Dubbo和ZooKeeper
    基于MATLAB的蒲公英算法求解单目标优化问题
    mysql之子表查询、视图、连接查询
    阿里云的流量价格表_2024阿里云服务器流量费用表
    VUE render函数使用和详解
    目标检测算法——收藏|小目标检测解决方案(三)
    数据库、计算机网络,操作系统刷题笔记6
    Tomcat服务部署、虚拟主机配置及参数优化
  • 原文地址:https://blog.csdn.net/u013984436/article/details/127109819