• 抽象工厂模式-Abstract Factory


    一、定义

    抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    二、结构

     

    抽象工厂模式的主要角色如下:

    1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
    2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
    3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
    4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。

    三、示例

    Nike公司和lining公司都会生产运动品牌产品,包括服装产品(夹克,T恤)和鞋类产品(跑鞋,篮球鞋)。

    下面用代码来实现。

    服装类产品

    /**
     * 服装产品
     */
    public interface Clothes {
    
        void printUsage();
    
    }
    
    /**
     * 夹克
     */
    public class JackClothes implements Clothes {
        
        @Override
        public void printUsage() {
            System.out.println("我是夹克衫,穿我很潮");
        }
        
    }
    
    /**
     * T恤
     */
    public class TShirtClothes implements Clothes {
    
        @Override
        public void printUsage() {
            System.out.println("我是T恤,随意");
        }
    
    }

    鞋类产品

    /**
     * 鞋类产品
     */
    public interface Shoe {
        
        void describeSelf();
    }
    
    /**
     * 跑鞋(具体的鞋类产品)
     */
    public class RunningShoe implements Shoe {
    
        @Override
        public void describeSelf() {
            System.out.println("我是跑鞋,我为自己带盐");
        }
    
    }
    
    /**
     * 篮球鞋(具体的鞋类产品)
     */
    public class BasketballShoe implements Shoe {
        
        @Override
        public void describeSelf() {
            System.out.println("我是篮球鞋,穿我打篮球吊到爆");    
        }
        
    }

    工厂

    /**
     * 抽象工厂
     */
    public interface Factory {
    
        /**
         * 既生产鞋类产品
         */
        Shoe produceShoe(BRAND brand);
    
        /**
         * 又能生产服装类商品
         */
        Clothes produceClothes(BRAND brand);
    }
    
    /**
     * 李宁工厂,生产鞋系列产品,也生产服装系列产品
     */
    public class LiningFactory implements Factory {
    
        /**
         * 生产鞋系列产品
         */
        @Override
        public Shoe produceShoe(BRAND brand) {
            if (BRAND.BASKETBALL_SHOE == brand) {
                System.out.println("---李宁工厂生产篮球鞋---");
                return new BasketballShoe();
            }
    
            if (BRAND.RUNNING_SHOE == brand) {
                System.out.println("---李宁工厂生产跑鞋---");
                return new RunningShoe();
            }
    
            return null;
        }
    
        /**
         * 生产服装系列产品
         */
        @Override
        public Clothes produceClothes(BRAND brand) {
            if (BRAND.JACK_CLOTHES == brand) {
                System.out.println("---李宁工厂生产夹克---");
                return new JackClothes();
            }
    
            if (BRAND.TSHIRT_CLOTHES == brand) {
                System.out.println("---李宁工厂生产T恤---");
                return new TShirtClothes();
            }
    
            return null;
        }
    }
    
    /**
     * Nike工厂,生产鞋系列产品,也生产服装系列产品
     */
    public class NikeFactory implements Factory {
    
        /**
         * 生产鞋子系列产品
         */
        @Override
        public Shoe produceShoe(BRAND brand) {
            if (BRAND.RUNNING_SHOE == brand) {
                System.out.println("---Nike工厂生产篮球鞋---");
                return new RunningShoe();
            }
    
            if (BRAND.BASKETBALL_SHOE == brand) {
                System.out.println("---Nike工厂生产跑鞋---");
                return new BasketballShoe();
            }
    
            return null;
        }
    
        /**
         * 生产服装系列产品
         */
        @Override
        public Clothes produceClothes(BRAND brand) {
            if (BRAND.JACK_CLOTHES == brand) {
                System.out.println("---Nike工厂生产夹克---");
                return new JackClothes();
            }
    
            if (BRAND.TSHIRT_CLOTHES == brand) {
                System.out.println("---Nike工厂生产T恤---");
                return new TShirtClothes();
            }
    
            return null;
        }
    
    }

    客户端代码

    public class Client {
    
        public static void main(String[] args) {
            // Nike工厂,生产鞋系列产品(篮球鞋,跑鞋)和服装系列产品(夹克,T恤)
            Factory nikeFactory = new NikeFactory();
            // 生产鞋系列产品
            Shoe nikeBasketballShoe = nikeFactory.produceShoe(BRAND.BASKETBALL_SHOE);// 篮球鞋
            Shoe nikeRunningshoe = nikeFactory.produceShoe(BRAND.RUNNING_SHOE);// 跑鞋
            nikeBasketballShoe.describeSelf();
            nikeRunningshoe.describeSelf();
            // 生产服装系列产品
            Clothes nikeJack = nikeFactory.produceClothes(BRAND.JACK_CLOTHES);// 夹克衫
            Clothes nikeTshit = nikeFactory.produceClothes(BRAND.TSHIRT_CLOTHES);// T恤
            nikeJack.printUsage();
            nikeTshit.printUsage();
    
            System.out.println("============================");
    
            // 李宁工厂,生产鞋系列产品(篮球鞋,跑鞋)和服装系列产品(夹克,T恤)
            Factory liningFactory = new LiningFactory();
            // 生产鞋系列产品
            Shoe liningBasketballShoe = liningFactory.produceShoe(BRAND.BASKETBALL_SHOE);
            Shoe liningRunningShoe = liningFactory.produceShoe(BRAND.RUNNING_SHOE);
            liningBasketballShoe.describeSelf();
            liningRunningShoe.describeSelf();
            // 生产服装系列产品
            Clothes liningJack = liningFactory.produceClothes(BRAND.JACK_CLOTHES);
            Clothes liningTshirt = liningFactory.produceClothes(BRAND.TSHIRT_CLOTHES);
            liningJack.printUsage();
            liningTshirt.printUsage();
        }
    }

    ……更多设计模式的内容,可以访问Refactoring.Guru

  • 相关阅读:
    界面演示
    监控其它进程
    cmd 里面运行git提示“不是内部或外部命令,也不是可运行的程序”的解决办法...
    CI框架与Thinkphp框架的一些区别
    php 设置error_reporting(0)和ini_set('display_errors', 0)之后,还是显示错误
    PHPStorm2017去掉函数参数提示
    Cad 首尾相连的线段连接成多段线
    利用C#进行AutoCAD的二次开发 颜色和样式
    修改SDE最大连接数
    利用C#进行AutoCAD的二次开发(三)(转自明经通道)
  • 原文地址:https://www.cnblogs.com/rouqinglangzi/p/11122316.html
Copyright © 2020-2023  润新知