惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LangChain Blog
Engineering at Meta
Engineering at Meta
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
M
MIT News - Artificial intelligence
IT之家
IT之家
The Register - Security
The Register - Security
月光博客
月光博客
Hugging Face - Blog
Hugging Face - Blog
The GitHub Blog
The GitHub Blog
博客园 - 聂微东
云风的 BLOG
云风的 BLOG
Microsoft Security Blog
Microsoft Security Blog
腾讯CDC
W
WeLiveSecurity
博客园_首页
A
About on SuperTechFans
G
Google Developers Blog
博客园 - 叶小钗
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
量子位
Google DeepMind News
Google DeepMind News
博客园 - 【当耐特】
aimingoo的专栏
aimingoo的专栏
Application and Cybersecurity Blog
Application and Cybersecurity Blog
博客园 - 三生石上(FineUI控件)
N
News | PayPal Newsroom
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
AI
AI
TaoSecurity Blog
TaoSecurity Blog
P
Proofpoint News Feed
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 司徒正美
www.infosecurity-magazine.com
www.infosecurity-magazine.com
J
Java Code Geeks
Hacker News - Newest:
Hacker News - Newest: "LLM"
爱范儿
爱范儿
S
SegmentFault 最新的问题
Martin Fowler
Martin Fowler
Vercel News
Vercel News
Schneier on Security
Schneier on Security
Know Your Adversary
Know Your Adversary
H
Heimdal Security Blog
N
News and Events Feed by Topic

博客园 - vito qi

安装VS2015出现的bug,各位安装请注意 苹果编程语言Swift简介 设计模式之三职责链模式 HTML页面做中间页跳转传递参数 第一个 ASP.NET Web API应用程序 ASP.NET MVC中 Jquery AJAX 获取数据利用MVC模型绑定实现输出 ASP.NET应用程序与页面生命周期 自定义服务器控件ImageButton 成功项目经理的三种领导力行为 深入理解C#之 参数传递 ref out params ASP.NET 实现文件下载 C#实现根据IP 查找真实地址 IIS 7.0的集成模式和经典模式 ASP.NET 4.0: 请求验证模式变化导致ValidateRequest=false失效 设计模式之—简单工厂设计模式 ASP.NET MVC 学习笔记(一) 数据库分离附加工具 c# 新特性 c#总结(一)
设计模式之二抽象工厂设计模式
vito qi · 2012-06-26 · via 博客园 - vito qi

继上篇简单工厂设计模式之后,今天继续讲解抽象工厂设计模式。在简单工厂中,我们的工厂类一次只可以处理一类产品。那么如果我们想处理多类产品,简单工厂是满足不了的。必须要用抽象工厂设计模式。

我们先从概念上来了解下什么是抽象工厂设计模式:

•1、提供一系列相互依赖对象的创建工作

•2、封装对象常规的创建方法(new)

•3、提供统一调用访问方法的方式

•4、避免调用访问方法和具体对象创建工作的紧耦合

这些概念性的东西看起来比较抽象,直接上图

如上图所示,我们如何去更好的理解抽象工厂,首先 我们要分清在这个模式中的几类角色。有抽象工厂,实体工厂,抽象产品,实体产品,客户(调用代码的类)。

•抽象工厂设计模式中各个对象的主要功能、职责:

•1、用抽象工厂生产抽象产品

•2、用实体工厂生产实体产品

•3、用抽象产品提供实体产品访问接口

•4、用实体产品实现自己的功能

直接上代码:

1、定义抽象产品 (父类可以是接口或者抽象类,我们定义一个抽象类,一个接口)

定义抽象产品A:

    /// <summary>
    /// 抽象产品A
    /// </summary>
    public abstract class Car
    {
        public abstract void Run();
    }

抽象产品B:

    /// <summary>
    /// 抽象产品B
    /// </summary>
    public interface IBus
    {
        void Run();
    }


2、定义实体产品

实体产品A1:

    /// <summary>
    /// 实体产品A1
    /// </summary>
   public class BMWCar:Car
    {
        public override void Run()
        {
            Console.WriteLine("宝马轿车在行驶!");
        }
    }

实体产品A2:

    /// <summary>
    /// 实体产品A2
    /// </summary>
    public class BenzCar:Car
    {
        public override void Run()
        {
            Console.WriteLine("奔驰轿车在行驶!");
        }
    }


实体产品B1:

    /// <summary>
    /// 实体产品B1
    /// </summary>
    public class BMWBus : IBus
    {
        public void Run()
        {
            Console.WriteLine("宝马大汽车");
        }
    }

实体产品B2:

    /// <summary>
    /// 实体产品B2
    /// </summary>
    public class BenzBus : IBus
    {
        public void Run()
        {
            Console.WriteLine("奔驰大汽车");
        }
    }


我们甚至可以再建N个A3,A4,B3,B4.................... 此处省略。

3、定义抽象工厂

众所周知现实生活中工厂都是生产产品的,在我们这 工厂是用来生产类的对象的。抽象工厂就是用来定义 工厂应该做什么的。相当于工厂接口规定工厂应该做什么。同时创建实体工厂对象,创建对象可以用反射,本例中只是为了说明抽象工厂的思想和具体实现。我们直接使用配置文件来读取。

    /// <summary>
    /// 抽象工厂
    /// </summary>
    public abstract class AbstractFactory
    {
        public static AbstractFactory CreateFactory(string strType)
        {
            AbstractFactory factory = null;
            switch (strType)
            {
                case "BMW":
                    factory = new BMWFactory();
                    break;
                case "Benz":
                    factory = new BenzFactory();
                    break;
            }
            return factory;
        }

        /// <summary>
        /// 抽象方法 创建Car对象
        /// </summary>
        /// <returns></returns>
        public abstract Car CreateCar();

        /// <summary>
        /// 创建BUS
        /// </summary>
        /// <returns></returns>
        public abstract IBus CreateBus();
    }

4、定义实体工厂

 实体工厂1:

   /// <summary>
    /// 实体工厂1
    /// </summary>
   public class BMWFactory:AbstractFactory
    {
        public override Car CreateCar()
        {
            return new BMWCar();
        }

        public override IBus CreateBus()
        {
            return new BMWBus();
        }
    }

实体工厂2:

    /// <summary>
    /// 实体工厂2
    /// </summary>
    public class BenzFactory : AbstractFactory
    {
        public override Car CreateCar()
        {
            return new BenzCar();
        }

        public override IBus CreateBus()
        {
            return new BenzBus();
        }
    }

5、客户端调用

从 最上面的图我们可以看出客户端调用抽象工厂的代码只关注抽象工厂和抽象产品,而不关注具体的实现类。如下图:

 由此我们得出抽象工厂的定义:

提供一个创建一系列相关或相互依赖对象的接口,无需指定它们具体的类

 static void Main(string[] args)
 {

            AbstractFactory factory = AbstractFactory.CreateFactory("Benz");
            Car car = factory.CreateCar();
            car.Run();
            IBus bus = factory.CreateBus();
            bus.Run();
   }

直接上代码:

点我下载