工厂方法模是定义一个勇于创建对象的接口,让子类决定实例化哪一个类。

抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

抽象工厂模式构成

抽象工厂角色(AbstractFactory):声明生成抽象产品的方法

具体工厂角色(ConcreteFactory):执行生成抽象产品的方法,生成一个具体的产品

抽象产品(AbstactProduct):为一种产品声明接口

具体产品(ConcreteProduct):定义具体工厂生成的具体产品的对象,实现产品接口

客户角色(Client):我们的应用程序,使用抽象产品和抽象工厂生成对象

以KFC为例阐述抽象工厂模式的应用,假设现在KFC的食品直接没有任何关联,不可以分类,各个Product相互独立。这样工厂方法模式就可以很好解决,定义一系列的简单工厂,用户没要求一种食品就

使用一个合适的简单工厂来生产相应的Product就可以。

  但实际情况下,KFC的产品还可以进行套餐出售,假设KFC的产品可以分为食品Food和饮料Drink,Food和Drink分别构成了一个产品族,一个产品族就是一系列相似对象的抽象。KFC出售2种套餐,

一种是经济型,包括鸡翅和可乐;另一种是豪华型,

包括鸡腿和咖啡。用户只需要指出需要的套餐名即可获得相应的Food和Drink。这种情况下,工厂方法模式将不再适用,而采用抽象工厂模式进行实现。

KFCFood.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式_KFC_
{
    /// <summary>
    /// 产品1,KFC食品
    /// </summary>
    abstract class KFCFood
    {
        public abstract void DisPlay();
    }
}

Chicken.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式_KFC_
{
    class Chicken : KFCFood
    {
        public override void DisPlay()
        {
            Console.WriteLine("鸡腿+1");
        }
    }
} 

Wings.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式_KFC_
{
    class Wings : KFCFood
    {
        public override void DisPlay()
        {
            Console.WriteLine("鸡翅+1");
        }
    }
} 

KFCDrink.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式_KFC_
{
    abstract class KFCDrink
    {
        public abstract void Display();
    }
} 

Coke.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式_KFC_
{
    class Coke : KFCDrink
    {
        public override void Display()
        {
            Console.WriteLine("可乐+1");
        }
    }
} 

Coffee.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式_KFC_
{
    class Coffce : KFCDrink
    {
        public override void Display()
        {
            Console.WriteLine("咖啡+1");
        }
    }
} 

IKFCFactory.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式_KFC_
{
    /// <summary>
    /// 抽象工厂,生产套餐
    /// </summary>
   interface IKFCFactory
    {
          KFCFood CreateFood();
          KFCDrink CreteDrink();
    }
} 

CheapPackageFactory.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式_KFC_
{
    /// <summary>
    /// 经济型套餐:鸡翅和可乐
    /// </summary>
    class CheapPackageFactory : IKFCFactory
    {
        public  KFCFood CreateFood()
        {
            return new Wings();
        }
        public  KFCDrink CreteDrink()
        {
            return new Coke();
        }
    }
} 

LuxuryPackageFactory.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式_KFC_
{
    /// <summary>
    /// 豪华型套餐:鸡腿和咖啡
    /// </summary>
    class LuxuryPackageFactory : IKFCFactory
    {
        public  KFCFood CreateFood()
        {
            return new Chicken();
        }
        public  KFCDrink CreteDrink()
        {
            return new Coffce();
        }
    }
} 

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式_KFC_
{
    class Program
    {
        static void Main(string[] args)
        {
            IKFCFactory factory1 = new CheapPackageFactory();
            KFCFood food = factory1.CreateFood();
            food.DisPlay();
            KFCDrink drink = factory1.CreteDrink();
            drink.Display();
            Console.Read();
        }
    }
} 

这个在初始化的时候出现一次,如果需求增加来自功能,比如新增一个套餐。

还有客户端程序不可能只有一个吗如果一百个客户端调用访问的类,就要修改100次 IKFCFactory factory1 = new CheapPackageFactory();

所以我们用简单工厂可以改进抽象工厂

   class Order
    {
        private static readonly string db = "CheapPackage";
        //private static readonly string db = "LuxuryPackage";
        public static KFCFood CreateFood()
        {
            KFCFood result = null;
            switch (db)
            {
                case "CheapPackage":
                    result = new Wings();
                    break;
                case "LuxuryPackage":
                    result = new Chicken();
                    break;
            }
            return result;
        }
        public static KFCDrink CreteDrink()
        {
            KFCDrink result = null;
            switch (db)
            {
                case "CheapPackage":
                    result = new Coke();
                    break;
                case "LuxuryPackage":
                    result = new Coffce();
                    break;
            }
            return result;
        }
    } 
         KFCFood food = Order.CreateFood();
            food.DisPlay();
            KFCDrink drink = Order.CreteDrink();

drink.Display();

第2例:

用了抽象工厂模式的数据访问程序:

Client:使用AbstractFactory和AbstractProduct类声明的接口

User 和 Department

    /// <summary>
    /// 用户类
    /// </summary>
    class User
    {
        private int _id;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }
    class Department
    {
        private int _id;
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }
        private string _deptName;
        public string DeptName
        {
            get { return _deptName; }
            set { _deptName = value; }
        }
    } 

AbstractProduct:声明一类产品对象接口

IUser 和 IDepartment

    interface IUser
    {
        void Insert(User user);
        User GetUser(int id);
    } 
    interface IDepartment
    {
        void Insert(Department department);
        Department GetDepartment(int id);
    } 

Product:
定义一个被相应具体工厂创建的产品对象
实现AbstractProduct接口

SqlserverUser  AccessUser. SqlserverDepartment  AccessDepartment

    class SqlserverUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在 SQL SERVER 2008 中给User表增加一条记录");
        }
        public User GetUser(int id)
        {
            Console.WriteLine("在 SQL SERVER 2008 中根据ID得到User表一条记录");
            return null;
        }
    } 
    class AccessUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在 Access 中给User表增加一条记录");
        }
        public User GetUser(int id)
        {
            Console.WriteLine("在 Access 中根据ID得到User表一条记录");
            return null;
        }
    } 
    class SqlserverDepartment : IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在 SQLSERVER 2008中给Department 表增加一条记录");
        }
        public Department GetDepartment(int id)
        {
            Console.WriteLine("在 SQLSERVER 2008中根据ID得到 Department 表一条记录");
            return null;
        }
    } 
    class AccessDepartment : IDepartment
    {
        public void Insert(Department department)
        {
            Console.WriteLine("在 Access 中给Department 表增加一条记录");
        }
        public Department GetDepartment(int id)
        {
            Console.WriteLine("在 Access 中根据ID得到 Department 表一条记录");
            return null;
        }
    } 

AbstactFactory:声明一个创建抽象产品对象的操作接口

IFactory

    interface IFactory
    {
        IUser CreateUser();
        IDepartment CreateDepartment();
    } 

ConcreteFactory:实现创建具体产品对象的操作

SqlserverFactory、AccessFactory

    class SqlserverFactory : IFactory
    {
        public IUser CreateUser()
        {
            return new SqlserverUser();
        }
        public IDepartment CreateDepartment()
        {
            return new SqlserverDepartment();
        }
    } 
    class AccessFatory:IFactory
    {
        public IUser CreateUser()
        {
            return new AccessUser();
        }
        public IDepartment CreateDepartment()
        {
            return new AccessDepartment();
        }
    } 
        static void Main(string[] args)
        {
            User user = new User();
            Department dept = new Department();
            //IFactory factory = new SqlserverFactory(); //创建SQLSERVER
            IFactory factory = new AccessFatory();  //创建Access
            IUser iu = factory.CreateUser();
            iu.Insert(user);
            iu.GetUser(1);
            Console.WriteLine();
            IDepartment idpt = factory.CreateDepartment();
            idpt.Insert(dept);
            idpt.GetDepartment(1);
            Console.Read();

}

来自为知笔记(Wiz)

附件列表

转载于:https://www.cnblogs.com/tangge/p/5900279.html

设计模式 - (3)抽象工厂模式(创建型)相关推荐

  1. 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型

    1.模式定义: 抽象工厂是应对产品族概念的,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类 2.模式特点: 抽象工厂模式为创建一组对象提供了一种解决方案.与工厂方法模式相比,抽象工 ...

  2. AbstractFactory抽象工厂模式(创建型模式)

    1.new 的问题 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对具体实例的变化 怎么理解上面这句话呢? 可以这样理解:我 ...

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

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

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

    原文:设计模式之四(抽象工厂模式第三回合) 前言 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式最大的好处便是易于交换产品系列,由于具体工厂类,例如I ...

  5. python抽象工厂模式_Python设计模式之抽象工厂模式

    Python设计模式之抽象工厂模式 这篇文章主要为大家详细介绍了Python设计模式之抽象工厂模式,感兴趣的小伙伴们可以参考一下 python面向对象编程入门,我们需要不断学习进步 "&qu ...

  6. 设计模式-04抽象工厂模式

    设计模式-04抽象工厂模式 文章中涉及到的代码,请自行下载 https://gitee.com/pan_xiao_lei123/designmode.git 前面介绍的工厂方法模式中考虑的是一类产品的 ...

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

    C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法 ...

  8. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

  9. 设计模式三—抽象工厂模式

    设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...

  10. 设计模式复习-抽象工厂模式

    设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...

最新文章

  1. ARC指南 strong和weak指针
  2. python类装饰器详解-Python装饰器基础概念与用法详解
  3. Caffe —— Deep learning in Practice 深度学习实践
  4. 【LeetCode每周算法】两数相加
  5. 游戏在ios和android,陈情令手游ios和安卓互通吗 ios和安卓能一起玩吗
  6. Oracle 11gR2 RAC 中的 Grid Plug and Play(GPnP) 是什么?
  7. 二叉树前序、中序和后序遍历的非递归实现
  8. Android之Notification制作多媒体控制器
  9. scanf输入数组_清除C / C ++中的输入缓冲区,妈妈再也不用担心我的学习
  10. 14种模式解决面试算法编程题(PART I)
  11. 【Mybatis】Mybatis三大组件之StatementHandler
  12. 火山PC_数据库知识_MySQL操作
  13. 川大scu显示无法连接认证服务器,win10锐捷客户端无法认证服务器怎么办?-处理win10锐捷客户端认证失败的方法 - 河东软件园...
  14. Flutter图片处理之高斯模糊
  15. Freebase调研(持续更新中)
  16. oracle错误信息提示中英文显示切换
  17. SQL企业管理器打不开
  18. 弱电流检测必备的保护环
  19. ISDEV : error -6003的解决办法
  20. DAB-Deformable-DETR源码学习记录之模型构建(二)

热门文章

  1. C++.Net在Release方式下单步调试时需要修改一些设置,否则变量会有错位或乱码,切记!...
  2. openmv探索_3_测距以及测量物体大小
  3. cmd 下关闭不需要的进程
  4. 2个Python入门级的实战项目
  5. 你知道吗?还有比自回归方式更快更好的序列生成!
  6. 【知识图谱】一文全览,ICLR 2020 上的知识图谱研究
  7. 【深度学习】神经网络为何非激活函数不可?
  8. 【干货】统计学思维导图
  9. 191029_中国地震局爬取
  10. 【每日算法Day 92】经典面试题:编辑距离