设计者模式详解--抽象工厂模式

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 抽象工厂类,提供了创建一组相关或相互依赖的对象的接口。

    /// <summary>
    /// 抽象工厂类
    /// </summary>
    public interface IDatabaseFactory
    {

        IEmployee CreateEmployee();

        IUser CreateUser();
    }

    3.3.2 具体工厂类,提供了创建SqlServer,或Access具体产品的实现

    /// <summary>
    /// 与SqlServer相关产品的实现
    /// </summary>
    public class SqlServerDatabaseFactory : IDatabaseFactory
    {

        public IEmployee CreateEmployee()
        {

            return new SqlEmployee();
        }

        public IUser CreateUser()
        {

            return new SqlUser();
        }

    }

    /// <summary>
    /// 与Access相关产品的实现
    /// </summary>
    public class AccessDatabaseFactory : IDatabaseFactory
    {

        public IEmployee CreateEmployee()
        {

            return new AccessEmployee();
        }

        public IUser CreateUser()
        {

            return new AccessUser();
        }

    }

    3.3.3 两个抽象产品,分别是IUser和IEmployee

    /// <summary>
    /// 抽象产品
    /// </summary>
    public interface IUser
    {
        User GetUser();

        bool SaveUser();
    }

    /// <summary>
    /// 抽象产品
    /// </summary>
    public interface IEmployee
    {

        Employee GetEmployee();

        bool SaveEmployee();
    }

  3.3.4 具体产品的实现

    /// <summary>
    /// 与SqlServer相关的具体产品User
    /// </summary>
    public class SqlUser : IUser
    {
        public User GetUser()
        {

            return null;
        }

        public bool SaveUser()
        {

            return false;
        }

    }

    /// <summary>
    /// 与SqlServer相关的具体产品Employee
    /// </summary>
    public class SqlEmployee : IEmployee
    {

        public SqlEmployee()
        {

        }

        public Employee GetEmployee()
        {

            return null;
        }

        public bool SaveEmployee()
        {

            return false;
        }

    }

    /// <summary>
    /// 与Access相关的具体产品User
    /// </summary>
    public class AccessUser : IUser
    {

        public AccessUser()
        {

        }

        public User GetUser()
        {

            return null;
        }

        public bool SaveUser()
        {

            return false;
        }

    }

    /// <summary>
    /// 与Access相关的具体产品Employee
    /// </summary>
    public class AccessEmployee : IEmployee
    {

        public AccessEmployee()
        {

        }

        public Employee GetEmployee()
        {

            return null;
        }

        public bool SaveEmployee()
        {

            return false;
        }

    }

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

原文地址:https://www.cnblogs.com/hongmoshui/p/10438171.html

时间: 2024-08-19 10:07:35

设计者模式详解--抽象工厂模式的相关文章

浅析设计模式(六)——创建型模式之Abstract-Factory(抽象工厂模式)

抽象工厂模式Abstract-Factory 本文的套路: 抽象工厂模式的定义 抽象工厂模式的参与者及其角色 抽象工厂模式的类图 抽象工厂模式的示例 参考 抽象工厂模式的定义 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 前面[浅析设计模式(四)--创建型模式之Simple-Factory(简单工厂方法,非设计模式)]中介绍的简单工厂方法,虽然已经对变化的部分进行了封装,但是这里只由一个对象负责所有的具体类的实例化,因此每次有新增对象类型时,都需要改变工厂的源码进行扩展.

(创建型模式三)抽象工厂模式

package com.eyugame.modle; /** * 抽象工厂模式 * * @author JYC506 * */ public class MyFactory implements IAbstractFactory { @Override public IProduct1 createIProduct1() { return new Product1(); } @Override public IProduct2 createIProduct2() { return new Pro

设计模式之创建型模式—— 1.3 抽象工厂模式

<?php /**  * 1.3 抽象工厂模式  * 解决的问题:  *  如何解决多个类实例化对象的问题.  * 解决的方案:  *  提供一个创建一系列相关或相互依赖对象的  *    接口,而无需指定它们具体的类.  * 该模式包含四种角色:  *  1. 抽象产品角色(两个或多个)  *  职责:同工厂方法模式  *    2. 具体产品角色  *    职责:同工厂方法模式  *      3. 抽象工厂角色  *    职责:同工厂方法模式  *      4. 具体工厂角色  * 

《JAVA与模式》之抽象工厂模式

场景问题 举个生活中常见的例子--组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择CPU的时候,面临一系列的问题,比如品牌.型号.针脚数目.主频等问题,只有把这些问题都确定下来,才能确定具体的CPU. 同样,在选择主板的时候,也有一系列问题,比如品牌.芯片组.集成芯片.总线频率等问题,也只有这些都确定了,才能确定具体的主板. 选择不同的CPU和主板,是每个客户在组装电脑的时候,向

工厂模式三部曲之抽象工厂模式

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码.因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解. 举例如下:(我们举一个发送邮件和短信的例子) public interface Sender { public void Send(); } 两个实现类:

工厂模式三部曲:抽象工厂模式

工厂模式三部曲:简单工厂模式 工厂模式三部曲:工厂方法模式 前言 这是工厂模式三部曲中的最后一篇了,在这篇文章中将会讲述抽象工厂模式,抽象工厂模式正如其名字一样,非常抽象.但是抽象工厂模式的功能却十分强大,对抽象工厂的利用也非常好. 这篇文章中会像本系列第一篇一样,给出普通实现方式和使用了反射机制的实现两种代码,并且会说明这两种实现方式的区别.并且在文章的最后,会将这三种模式放在一起,对这三种工厂模式进行总结. 本人理解可能不够深刻,这一系列文章中存在的问题,欢迎大家提出,谢谢! 什么是抽象工厂

Spark 在yarn上运行模式详解:cluster模式和client模式

1.    官方文档 http://spark.apache.org/docs/latest/running-on-yarn.html 2.    配置安装 2.1.安装hadoop:需要安装HDFS模块和YARN模块,HDFS必须安装,spark运行时要把jar包存放到HDFS上. 2.2.安装Spark:解压Spark安装程序到一台服务器上,修改spark-env.sh配置文件,spark程序将作为YARN的客户端用于提交任务 export JAVA_HOME=/usr/local/jdk1

抽象模式之【抽象工厂模式】

原则:依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体: 一.创建接口:发送消息 package Factory; public interface Sender{ public void Send(); } 二.创建两个实现类 1.发送邮箱 package Factory; public class MailSend implements Sender{ @Override public void Send() { System.out.println("mailsend");

创建和使用解耦——工厂模式详解(工厂方法+抽象工厂)

1.前言 直接new一个对象是最简单的创建对象的方式,但大量出现在业务代码中会带来至少两个问题.1:创建对象的细节直接暴露在业务代码中,修改实现细节必须修改相关的大量客户端代码.2:直接面向具体类型编程,违反了面向接口编程的原则,系统进行扩展时也不得不进行大量修改.要使得系统具有的良好的可扩展性以及后期易于维护,必须实现对产品的获取和对产品的使用解耦.要做到这两点,首先要对客户端代码屏蔽掉创建产品的细节,其次,客户端必须面向产品的抽象编程,利用java的多态特性在运行时才确定具体的产品.而这,正