• 浅谈Java设计模式——抽象工厂模式(AbstractFactory)


    一、对比简单工厂模式、工厂方法模式

            简单工厂模式只通过一个工厂类,通过给定参数返回相应的实例对象。工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。 普通工厂产出是一个产品(实例),抽象工厂产出是一个抽象(接口)

    二、概述

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

    三、使用场景

            为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

    1.一个系统要独立于它的产品的创建、组合和表示时。
    2.一个系统要由多个产品系列中的一个来配置时。 
    3.当你要强调一系列相关的产品对象的设计以便进行联合使用时。
    4.当你提供一个产品类库,而只想显示它们的接口而不是实现时。  

    四、参与者

    1.AbstractFactory 声明一个创建抽象产品对象的操作接口。 
    2.ConcreteFactory 实现创建具体产品对象的操作。 
    3.AbstractProduct 为一类产品对象声明一个接口。
    4.ConcreteProduct 定义一个将被相应的具体工厂创建的产品对象。 实现AbstractProduct接口。 
    5.Client 仅使用由AbstractFactory和AbstractProduct类声明的接口

    四、类图

    五、代码实现

    AbstractProduct(抽象产品):定义抽象工厂中要生产的抽象产品接口ICat和IDog

    public interface IDog {
        void describe();
    }

    public interface ICat {
        void describe();
    }

    ConcreteProduct(具体产品):创建产品的实现类IDog、BlackDog、WhiteDog;ICat、BlackCat、WhiteCat


    public class BlackDog implements IDog {
        @Override
        public void describe() {
            System.out.println("describe class and method: this black dog ...");
        }
    }

    public class BlackCat implements ICat {
        @Override
        public void describe() {
            System.out.println("describe class and method: this black cat ...");
        }
    }

    public class WhiteCat implements ICat {
        @Override
        public void describe() {
            System.out.println("describe class and method: this white cat ...");
        }
    }

    AbstractFactory:定义抽象工程类IAnimalFactory

    public interface IAnimalFactory {
        IDog createDog();
    
        ICat createCat();
    }

     ConcreteFactory:创建抽象工厂类的两个实现类,WhiteAnimalFactory和BlackAnimalFactory

    public class BlackAnimalFactory implements IAnimalFactory{
        @Override
        public IDog createDog() {
            return new BlackDog();
        }
    
        @Override
        public ICat createCat() {
            return new BlackCat();
        }
    }

    public class WhiteAnimalFactory implements IAnimalFactory {
        @Override
        public IDog createDog() {
            return new WhiteDog();
        }
    
        @Override
        public ICat createCat() {
            return new WhiteCat();
        }
    }

    六、总结

              工厂方法确实为系统结构提供了非常灵活强大的动态扩展机制,只要我们更换一下具体的工厂方法,系统其他地方无需一点变换,就有可能将系统功能进行改头换面的变化。

  • 相关阅读:
    NDCG
    卷积核
    高斯核函数映射到无限维
    《Towards Knowledge-Based Recommender Dialog System》阅读笔记
    Pytorch官方教程:含注意力的seq2seq2机器翻译
    cad 已知拱高弦长求弧长
    MySQL直接将数据库的文件夹从服务器复制到本地,打开表提示需要修复 “is marked as crashed and should be repaired ”
    CSS小技巧:利用border实现三角形箭头
    完美解决ERROR 1064 (42000): You have an error in your SQL syntax; check the manual…
    Java 理论与实践:正确使用 Volatile 变量
  • 原文地址:https://www.cnblogs.com/IdealSpring/p/11871177.html
Copyright © 2020-2023  润新知