zoukankan      html  css  js  c++  java
  • 设计者模式详解--抽象工厂模式

    1. 概述
      抽象工厂模式为一个产品家族提供了统一的创建接口。当需要这个产品家族的某一系列的时候,可以从抽象工厂中选出相对应的系列来创建一个具体的工厂类别。

    2. 抽象工厂模式中的角色

       2.1 抽象工厂(AbstractFactory):担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。

       2.2 具体工厂(ConcreteFactory):这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。

       2.3 抽象产品(AbstractProduct):担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。

       2.4 具体产品(ConcreteProduct):抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。

    3. 实例:更换数据库。现有系统使用的是SqlServer数据库,它的Licence是付费的,有的客户想使用免费的数据库服务,如Access。有的客户拥有其它数据库服务商的Licence,他们也不想使用还要另付费的SqlServer。

       3.1 解决这个问题的根本是将应用程序与数据库解耦,使得应用程序不再依赖某一个具体的数据库。抽象工厂给我们提供了解决方案。

       3.2 实现类图

        

      3.3 实现代码【以形状为等级、颜色为族来对系统进行进一步抽象的生活例子】

        3.3.1 公共接口与实现了该接口的具体抽象类【进行等级抽象,我们需要将不同的形状声明为抽象类(等级划分)并实现公共的抽象接口(Shape),然后具体的实现类继承自对应的抽象类】

    package com.hongmoshui.designMode.abstractFactory.test1;
    
    //形状公共接口
    public interface Shape
    {
        void draw();
    }
    
    // 圆形抽象类Circle
    abstract class Circle implements Shape
    {
        public abstract void draw();
    }
    
    // 长方形抽象类Rectange
    abstract class Rectange implements Shape
    {
        public abstract void draw();
    }
    // 其他图形抽象类... ...

        3.3.2 具体抽象类的具体产品的实现【具体的实现类继承自对应的抽象类,继承自不同的抽象类就相当于将类划分为不同的等级】

    package com.hongmoshui.designMode.abstractFactory.test1;
    
    //具体颜色的Circle实现
    //GreenCircle
    public class GreenCircle extends Circle
    {
        @Override
        public void draw()
        {
            System.out.println("绘制绿色圆");
        }
    }
    
    // BlueCircle
    class BlueCircle extends Circle
    {
        @Override
        public void draw()
        {
            System.out.println("绘制蓝色的圆");
        }
    }
    
    class RedCircle extends Circle
    {
        @Override
        public void draw()
        {
            System.out.println("绘制红色的圆");
        }
    }
    
    // 具体颜色的Rectange实现
    class RedRectange extends Rectange
    {
        @Override
        public void draw()
        {
            System.out.println("绘制红色长方形");
        }
    }
    
    // GreenRectange
    class GreenRectange extends Rectange
    {
        @Override
        public void draw()
        {
            System.out.println("绘制绿色长方形");
        }
    }
    
    class BlueRectange extends Rectange
    {
        @Override
        public void draw()
        {
            System.out.println("绘制蓝色长方形");
        }
    }

        3.3.3 抽象工厂与其具体实现工厂【定义一个抽象工厂,具体工厂(族)实现抽象工厂的方法来生成一组具体对象】

    package com.hongmoshui.designMode.abstractFactory.test1;
    
    //抽象工厂ShapeFactory 
    public interface ShapeFactory
    {
        Shape getCircle();
    
        Shape getRectange();
    }
    
    // RedShapeFactory(他所代表的是红色形状这一族)
    class RedShapeFactory implements ShapeFactory
    {
    
        public Shape getCircle()
        {
            return new RedCircle();
        }
    
        public Shape getRectange()
        {
            return new RedRectange();
        }
    }
    
    // GreenShapeFactory
    class GreenShapeFactory implements ShapeFactory
    {
        public Shape getCircle()
        {
            return new GreenCircle();
        }
    
        public Shape getRectange()
        {
            return new GreenRectange();
        }
    
    }
    
    // BlueShapeFactory(他所代表的是兰色形状这一族)
    class BlueShapeFactory implements ShapeFactory
    {
    
        public Shape getCircle()
        {
            return new BlueCircle();
        }
    
        public Shape getRectange()
        {
            return new BlueRectange();
        }
    }
    
    // ...其他族...

      3.3.4 测试

    package com.hongmoshui.designMode.abstractFactory.test1;
    
    public class TestDemo
    {
        public static void main(String[] args)
        {
            ShapeFactory redShapeFactory = new RedShapeFactory();
            Shape circle = redShapeFactory.getCircle();
            circle.draw();
            Shape rectangle = redShapeFactory.getRectange();
            rectangle.draw();
    
            ShapeFactory blueShapeFactory = new BlueShapeFactory();
            Shape blueCircle = blueShapeFactory.getCircle();
            blueCircle.draw();
            Shape rectange = blueShapeFactory.getRectange();
            rectange.draw();
        }
    }

    4. 模式总结

      4.1 优点
        4.1.1 具体产品从客户代码中被分离出来
        4.1.2 容易改变产品的系列(如SqlServer产品系列,Access产品系列)
        4.1.3 将一个系列的产品族统一到一起创建

      4.2 缺点
        在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口,如增加一种产品Customer变得非常困难。

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

    原文链接:https://www.cnblogs.com/wangjq/archive/2012/06/27/2561479.html

  • 相关阅读:
    mac与ip为什么同时存在
    tcp四次挥手
    tcp三次握手
    GET与POST的区别
    Servlet.service() for servlet [jsp] in context ....错误
    c3p0连接数据库时注意事项
    finalize()及垃圾回收
    composer 安装新包失败的原因之一
    如何使用优酷开放平台获取视频播放列表
    php解析优酷网上的视频资源去广告
  • 原文地址:https://www.cnblogs.com/hongmoshui/p/10438171.html
Copyright © 2011-2022 走看看