• 设计模式:抽象工厂模式


    一.产品等级结构 产品族

    图中有正方形和圆形,相同颜色代表一个产品族,相同形状代表一个同一个产品等级结构。

    例如美的电器生产多种家用电器,那么深红色正方形代表美的空调,深红色圆形代表美的洗衣机,但是同一个纵坐标,都是美的产品。

    同理粉红色正方形代表格力空调,粉红色圆形代表隔离洗衣机,同一个横坐标都是同一个产品等级结构,都是空调或者洗衣机。

    二.抽象工厂模式

    该模式适用于需要生成产品族的场景,抽象产品内部提供了多个其他抽象产品,抽象工厂类定义了产品的创建接口,通过具体的工厂子类,就可以生产相应的产品族对象,供用户端使用。

    三.通用写法

    产品类

    //抽象产品A
    public interface IProductA {
        public void doA();
    }
    
    //抽象产品B
    public interface IProductB {
        public void doB();
    }
    
    //产品族A的具体产品A
    public class ProductAWithFamilyA implements IProductA{
        @Override
        public void doA() {
            System.out.println("ProductAWithFamilyA");
        }
    }
    
    //产品族B的具体产品A
    public class ProductAWithFamilyB implements IProductA{
        @Override
        public void doA() {
            System.out.println("ProductAWithFamilyB");
        }
    }
    
    //产品族A的具体产品B
    public class ProductBWithFamilyA implements IProductB{
        @Override
        public void doB() {
            System.out.println("ProductBWithFamilyA");
        }
    }
    
    //产品族B的具体产品B
    public class ProductBWithFamilyB implements IProductB{
        @Override
        public void doB() {
            System.out.println("ProductBWithFamilyB");
        }
    }

     工厂:

    //抽象工厂
    public interface IFactory {
        IProductA produceA();
        IProductB produceB();
    }
    
    //具体工厂类A
    public class FactoryA implements IFactory {
        @Override
        public IProductA produceA() {
            return new ProductAWithFamilyA();
        }
    
        @Override
        public IProductB produceB() {
            return new ProductBWithFamilyA();
        }
    }
    
    //具体工厂类B
    public class FactoryB implements IFactory {
        @Override
        public IProductA produceA() {
            return new ProductAWithFamilyB();
        }
    
        @Override
        public IProductB produceB() {
            return new ProductBWithFamilyB();
        }
    }

     测试:

    public class Test {
        public static void main(String[] args) {
            IFactory factory = new FactoryA();
            IProductA productA = factory.produceA();
            productA.doA();
            IProductB productB = factory.produceB();
            productB.doB();
        }
    } 

     

    四.uml图

    五.抽象工厂在spring中的运用

    在Spring种,所有工厂都是BeanFactory的子类,通过BeanFactory的实现,我们可以从spring容器访问Bean。

    缺点:

    1.规定了所有可能被创建的产品集合,产品族种扩展新的产品困难。

    2.增加了系统的抽象性和理解难度。

  • 相关阅读:
    python基本数据类型剖析
    常用正则表达式
    python_re模块
    迭代器模式
    状态模式
    备忘录模式
    asp.net 发送邮件
    建造者模式
    抽象工厂模式
    摸板模式与钩子
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/13581306.html
Copyright © 2020-2023  润新知