zoukankan      html  css  js  c++  java
  • 抽象工厂

    一、概述

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

    这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    主要解决:主要解决接口选择的问题。

    何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

    与工厂模式相比:

    抽象工厂模式是在工厂模式上面再封装了一层,工厂模式的工厂是直接创建的,而抽象工厂是采用工厂模式创建对象的方法,在工厂模式的基础上把工厂的创建也封装起来。

    二、使用

    示例:

    package pattern.abstractFactory;
    
    /**
     * 抽象工厂模式
     *      创建其他工厂的工厂
     * @author zls
     * @date 2020/3/27
     */
    public class AbstractFactoryTest {
        public static void main(String[] args) {
            FactoryProducer factoryProducer = new FactoryProducer();
            // 从抽象工厂中获取到工厂,而工厂模式直接是自己创建的
            AbstractFactory car = factoryProducer.getFactory("car");
            AbstractFactory color = factoryProducer.getFactory("color");
    
            // 从工厂中获取不同类型的对象
            Car benz = car.getCar("benz");
            Car bmw = car.getCar("bmw");
            benz.run();
            bmw.run();
    
            Color red = color.getColor("red");
            Color green = color.getColor("green");
            red.fill();
            green.fill();
        }
    }
    
    /**
     * 公共接口
     */
    interface Car {
        void run();
    }
    
    class Benz implements Car {
        @Override
        public void run() {
            System.out.println("大奔跑得快...");
        }
    }
    
    class Bmw implements Car {
        @Override
        public void run() {
            System.out.println("宝马跑得稳...");
        }
    }
    
    interface Color {
        void fill();
    }
    
    class Red implements Color {
        @Override
        public void fill() {
            System.out.println("填充红色...");
        }
    }
    
    class Green implements Color {
        @Override
        public void fill() {
            System.out.println("填充绿色...");
        }
    }
    
    /**
     * 工厂的父类:为了有一个统一的接口,当然这里也可以是一个接口
     */
    abstract class AbstractFactory {
        abstract Car getCar(String car);
        abstract Color getColor(String color);
    }
    
    /**
     * 创建汽车工厂
     */
    class CarFactory extends AbstractFactory{
        @Override
        public Car getCar(String type) {
            if (type.equalsIgnoreCase("benz")) {
                return new Benz();
            } else if (type.equalsIgnoreCase("bmw")) {
                return new Bmw();
            }
            return null;
        }
    
        @Override
        Color getColor(String color) {
            return null;
        }
    }
    
    /**
     * 颜色工厂
     */
    class ColorFactory extends AbstractFactory {
        @Override
        Car getCar(String car) {
            return null;
        }
    
        @Override
        Color getColor(String color) {
            if (color.equalsIgnoreCase("red")) {
                return new Red();
            } else if (color.equalsIgnoreCase("green")) {
                return new Green();
            }
            return null;
        }
    }
    
    /**
     * 核心:抽象工厂,创建其他工厂的工厂
     * 创建一个工厂创造器/生成器类
     */
    class FactoryProducer {
        public static AbstractFactory getFactory(String factory) {
            if (factory.equalsIgnoreCase("car")) {
                return new CarFactory();
            } else if (factory.equalsIgnoreCase("color")) {
                return new ColorFactory();
            }
            return null;
        }
    }

    参考:

    抽象工厂模式

  • 相关阅读:
    python报错Enable tracemalloc to get the object allocation traceback
    解决pycharm每次新建项目都要重新安装一些第三方库的问题
    创建一个CA证书
    [转载]oracle 12C 《服务器、客户端安装》
    [转载]Windows Server 2016中添加AD域控制器
    [转载]Windows Server 2016中部署AD
    虚拟机 VMware Workstation Pro 15.5.0 及永久激活密钥
    Oracle给查询结果增加序列号
    创建自定义ssl证书用于https
    js:getAttribute
  • 原文地址:https://www.cnblogs.com/shiyun32/p/12591104.html
Copyright © 2011-2022 走看看