Head First设计模式之抽象工厂模式

一、定义

给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:
     1)系统中有多个产品族,而系统一次只可能消费其中一族产品。 
     2)同属于同一个产品族的产品以其使用。 

二、结构

抽象工厂模式的各个角色(和工厂方法一样): 
     1)抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 
     2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
     3)抽象产品角色:它是具体产品继承的父类或者是实现的接口。
     4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

三、实现

 

namespace DesignPatterns.AbstractFactory
{
    class Program
    {
        static void Main(string[] args)
        {
            IAbstractFactory factory = null;

            factory = new XiaomiFactory();
            factory.ProductMobile();
            factory.ProductMp3();

            factory = new HuaweiFactory();
            factory.ProductMobile();
            factory.ProductMp3();
        }
    }

    public abstract class AbstractProduct
    {

    }

    public abstract class Mobile : AbstractProduct
    {

    }
    public class XiaomiMobile : Mobile
    {

    }
    public class HuaweiMobile : Mobile
    {

    }
    public abstract class Mp3 : AbstractProduct
    {
    }
    public class XiaomiMp3 : Mp3
    {
    }
    public class HuaweiMp3 : Mp3
    {
    }

    public interface IAbstractFactory
    {
        Mobile ProductMobile();
        Mp3 ProductMp3();
    }

    public class XiaomiFactory : IAbstractFactory
    {
        public Mobile ProductMobile()
        {
            Console.WriteLine("生产小米手机.");
            return new XiaomiMobile();
        }

        public Mp3 ProductMp3()
        {
            Console.WriteLine("生产小米MP3.");
            return new XiaomiMp3();
        }
    }

    public class HuaweiFactory : IAbstractFactory
    {
        public Mobile ProductMobile()
        {
            Console.WriteLine("生产华为手机.");
            return new HuaweiMobile();
        }

        public Mp3 ProductMp3()
        {
            Console.WriteLine("生产华为MP3.");
            return new HuaweiMp3();
        }
    }
}

 

 

四、适用场景

  1、QQ 换皮肤,一整套一起换。

  2、生成不同操作系统的程序。

五、优缺点

优点:

抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。

当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点:

增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性

 

 

欢迎阅读本系列文章:Head First设计模式之目录

 

时间: 2024-10-26 18:00:35

Head First设计模式之抽象工厂模式的相关文章

乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) 作者:webabcd 介绍 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例 有Message和MessageModel,Message有一个Insert()方法,该方法的参数是MessageModel. AbstractMessageModel usi

C#设计模式(4)——抽象工厂模式

原文:C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是本专

设计模式之四(抽象工厂模式第三回合)

原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如IFactory factory=new AccessFactory(),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置.我们的设计不能去防止需要的变更,那么我们的理想便是让改动变得最小,那么现在如果你要更改数据库访问,

设计模式之四(抽象工厂模式第一回合)

原文:设计模式之四(抽象工厂模式第一回合) 前言 首先关于抽象工厂模式的学习,我们需要慢慢的,由浅入深的进入.不能单刀直入,否则可能达不到预期学明白的目标. 第一回合  首先我们从最简单的数据访问程序开始吧. 下面先来看一个简单的小例子,代码很简单 public class User { public int ID{get;set;} public string Name{get;set;} } 一个简单的实体类,也相当于在SqlServer数据库中建立了相同的数据表 public class

C++设计模式之抽象工厂模式_C 语言

问题描述 之前讲到了C++设计模式--工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Product的,所以工厂方法模式中,每个工厂只能创建单一种类的产品,当需要生产一种全新的产品(不继承自Product)时,发现工厂方法是心有余而力不足. 举个例子来说:一个显示器电路板厂商,旗下的显示器电路板种类有非液晶的和液晶的:这个时候,厂商建造两个工厂,工厂A负责生产非液晶显示器电路板,工厂B负责生产

设计模式之抽象工厂模式

关于设计模式找到了一个系列讲的非常到位,也很容易让人理解,这里我也是看下面的博客来理解抽象工厂模式. http://blog.csdn.net/column/details/loveyun.html?&page=2 理解抽象工厂应先了解产品族.产品等级的概念: 所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族.比如AMD的主板.芯片组.CPU组成一个家族,Intel的主板.芯片组.CPU组成一个家族.而这两个家族都来自于三个产品等级:主板.芯片组.CPU.一个等级结构是由相同的

Python设计模式之抽象工厂模式_python

python面向对象编程入门,我们需要不断学习进步 """抽象工厂模式的实现""" import random class PetShop: """宠物商店""" def __init__(self, animal_factory=None): """宠物工厂是我们的抽象工厂.我们可以随意设置.""" self.pet_fact

艾伟_转载:.NET设计模式:抽象工厂模式(Abstract Factory)

概述 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式. 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 模型图 逻辑模型: 物理模型: 生活中的例子 抽象工厂的目的是要提供一个创建一系列相关或

.NET简谈设计模式之(抽象工厂模式)

我们继续学习设计模式系列文章. 今天要讲的是设计模式中经常被用到的"工厂模式",所谓工厂模式就是将对象的创建交给一个叫做工厂的对象来统一进行处理.主要是将对象的依赖关系进行解耦,消除对象之间的直接耦合.那么工厂的使用有几种方式呢?那就要看我们对工厂的理解了,工厂是创建对象的一个逻辑名称,工厂可以是一个方法.一个静态类等等.只要起到对象的创建就能给它赋予上一个工厂的名称. 那么什么是抽象工厂呢?我想很多人对它的理解并不是很透彻,甚至有的人就觉得工厂一定要是抽象的.我表示不理解,一个抽象类