zoukankan      html  css  js  c++  java
  • 设计模式之抽象工厂模式

    抽象工厂模式介绍

    抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例

    1、类图

    2、建项目就不一一说了,请见设计模式之简单工厂

    ……………………………………

    3、 新建Logger接口:日志记录器接口,充当抽象产品角色。

    namespace FactoryMethodSample
    {
        interface Logger
        {
            void WriteLog();
        }
    }

    4、新建DatabaseLogger类:数据库日志记录器,充当具体产品角色。

    using System;
    namespace FactoryMethodSample
    {
        class DatabaseLogger : Logger 
        {
        	public void WriteLog()
            {
        		Console.WriteLine("数据库日志记录。");
        	}
        }
    }

    5、 新建FileLogger类:文件日志金路器,充当具体产品角色。

    using System;
    namespace FactoryMethodSample
    {
        class FileLogger : Logger 
        {
            public void WriteLog()
            {
        		Console.WriteLine("文件日志记录。");
        	}
        }
    }

    6、 新建LoggerFactory接口;日志记录器工厂接口,充当抽象工厂角色。

    namespace FactoryMethodSample
    {
        interface LoggerFactory
        {
            Logger CreateLogger();
        }
    }

    7、新建DatabaseLoggerFactory类:数据库日志记录器工厂类,充当具体工厂角色。

    namespace FactoryMethodSample
    {
        class DatabaseLoggerFactory : LoggerFactory
        {
        	public Logger CreateLogger()
            {
    	//连接数据库,代码省略
    	//创建数据库日志记录器对象
    	Logger logger = new DatabaseLogger();
    	//初始化数据库日志记录器,代码省略
    	return logger;
       	 }
        }
    }

    8、 新建FileLoggerFactory类:文件日志记录器工厂类,充当具体工厂角色。

    namespace FactoryMethodSample
    {
        class FileLoggerFactory : LoggerFactory
        {
        	public Logger CreateLogger()
            {
                //创建文件日志记录器对象
    	Logger logger = new FileLogger();
    	//创建文件,代码省略
    	return logger;
        	}
        }
    }

    9、客服端

    using System;
    using System.Configuration;
    using System.Reflection; 
    namespace FactoryMethodSample
    {
        class Program
        {
            static void Main(string[] args)
            {
                /*
                LoggerFactory factory;
                Logger logger;
                factory = new FileLoggerFactory(); //可引入配置文件实现
                logger = factory.CreateLogger();
                logger.WriteLog();
                */
                LoggerFactory factory;
                Logger logger;
                //读取配置文件
                string factoryString = ConfigurationManager.AppSettings["factory"];
                //反射生成对象
                factory = (LoggerFactory)Assembly.Load("FactoryMethodSample").CreateInstance(factoryString);
                logger = factory.CreateLogger();
                logger.WriteLog();
                Console.Read();
            }
        }
    }

    10、 配置文件:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="factory" value="FactoryMethodSample.FileLoggerFactory"/>
      </appSettings>
    </configuration>

    总结

    无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

           所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。


  • 相关阅读:
    CSUOJ 1525 Algebraic Teamwork
    CSUOJ 1531 Jewelry Exhibition
    CSUOJ 1532 JuQueen
    POJ 2195 Going Home
    hiho week 37 P1 : 二分·二分查找之k小数
    POJ 2186 Popular Cows
    ZOJ 2532 Internship
    RQNOJ PID496/[IOI1999]花店橱窗布置
    POJ 3026 Borg Maze
    laravel框架总结(五) -- 服务提供者(提及契约Contracts)
  • 原文地址:https://www.cnblogs.com/cqxhl/p/12993320.html
Copyright © 2011-2022 走看看