设计模式之抽象工厂模式

168 阅读2分钟

1.介绍

1)抽象工厂模式:定义一个interface用于创建相关或有依赖关系得对象簇,而无需指明具体得类 2)抽象工厂模式可以将简单工厂模式工厂方法模式进行整合 3)从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象) 4)将工厂抽象成两层,AbstractFactory(抽象工厂)和具体实现的工厂子类。可以根据创建对象类型使用对应的工厂子类,这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展

2.实例

实例需求

  • 在简单工厂模式的实例下 新增女机器人和男机器人的工厂生产

抽象工厂模式代码

  • AbstractRobotFactory 抽象工厂定义

    public interface AbstractRobotFactory {
    
        Robot createRobot(String type);
    }
    
  • GirlRobotFactory 女机器人工厂用于生产女机器人

    public class GirlRobotFactory implements AbstractRobotFactory {
        @Override
        public Robot createRobot(String type) {
            Robot robot = null;
            if (type.equalsIgnoreCase("one")) {
                robot = new RobotOneGirl("第一代");
            } else if (type.equalsIgnoreCase("two")) {
                robot = new RobotTwoGirl("第二代");
            }
            return robot;
        }
    }
    
  • ManRobotFactory 男机器人工厂用于生产男机器人

    public class ManRobotFactory implements AbstractRobotFactory {
        @Override
        public Robot createRobot(String type) {
            Robot robot = null;
            if (type.equalsIgnoreCase("one")) {
                robot = new RobotOneMan("第一代");
            } else if (type.equalsIgnoreCase("two")) {
                robot = new RobotTwoMan("第二代");
            }
            return robot;
        }
    }
    
  • Client

    public class Client {
    
        public static void main(String[] args) {
            AbstractRobotFactory robotFactory = null;
            String input = getInput("输入需要创建girl还是man机器人:");
            switch (input) {
                case "girl":
                    robotFactory = new GirlRobotFactory();
                    break;
                case "man":
                    robotFactory = new ManRobotFactory();
                    break;
                default:
                    return;
            }
            while (true) {
                String type = getInput("输入机器人类别:");
                Robot robot = robotFactory.createRobot(type);
                if (robot != null) {
                    robot.create();
                } else {
                    System.exit(0);
                }
            }
        }
    
        public static String getInput(String msg) {
            try {
                BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
                System.out.println(msg);
                String str = strin.readLine();
                return str;
            } catch (IOException e) {
                e.printStackTrace();
                return "";
            }
        }
    }	
    
  • 运行结果

    输入需要创建girl还是man机器人:
    man
    输入机器人类别:
    one
    男机器人一代生产
    第一代头部
    第一代身体
    第一代手部
    第一代脚部
    输入机器人类别:
    two
    男机器人二代生产
    第二代头部
    第二代身体
    第二代手部
    第二代脚部
    输入机器人类别:
    ex	
    
    输入需要创建girl还是man机器人:
    girl
    输入机器人类别:
    one
    女机器人一代生产
    第一代头部
    第一代身体
    第一代手部
    第一代脚部
    输入机器人类别:
    two
    女机器人二代生产
    第二代头部
    第二代身体
    第二代手部
    第二代脚部
    输入机器人类别:
    ex