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;
        }
    }

    参考:

    抽象工厂模式

  • 相关阅读:
    android开发聊天输入框at某人的分隔符选取
    使用curl下载小文件的方法记录一下
    google play store注意事项
    android开发使用setOnClickListener点击事件实现双击事件的解决方法
    mac下Android Studio配置文件的路径记录一下
    android studio更新到3.6以上后布局文件不能切换到xml编辑器?那就点进来吧
    mac上使用Xcode编译调试LearnOpenGL源代码的方法
    android开发fragment里面使用百度地图黑屏错位的解决方法
    es7之修饰器
    解决 bash: vue command not found
  • 原文地址:https://www.cnblogs.com/shiyun32/p/12591104.html
Copyright © 2011-2022 走看看