抽象工厂模式 极其简单的例子

原文链接:http://www.cnblogs.com/StoneSH/archive/2013/04/04/2999649.html

第二篇博客:

以汽车为例 : 假设汽车有开车的方法, 也有创建汽车的方法

二话不说 满足开闭原则  定义抽象类 和接口

1.定义 抽象的车  ---车子有一个Drive开车的方法

namespace 抽象工厂模式
{
    /// <summary>
    /// 抽象产品 抽象----车
    /// </summary>
    interface ICar
    {
        void Drive();//开车的方法
    }
}
namespace 抽象工厂模式
{
    /// <summary>
    /// 抽象工厂
    /// </summary>
    interface ICreateFactory
    {
        ICar CreateCar();//创建车子--这里返回类型是 抽象的ICar
    }
}
namespace 抽象工厂模式
{
    /// <summary>
    /// 具体Car 继承自抽象Car
    /// </summary>
   public class BMW:ICar
    {
       /// <summary>
       /// 开车的方法
       /// </summary>
        public void Drive()
        {
            Console.Write("宝马车正在行驶\r\n");
        }
    }
}

 

namespace 抽象工厂模式
{
    /// <summary>
    /// 继承自抽象工厂  
    /// </summary>
    class BMWFactory:ICreateFactory
    {
        /// <summary>
        /// 在BMWFactory的工厂里创建
        /// </summary>
        /// <returns></returns>
        public ICar CreateCar()
        {
            Console.Write("创建宝马车。。。。\r\n");
            return new BMW();
        }
    }
}


配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="FactoryInstance" value="抽象工厂模式.BMWFactory"/>
    </appSettings>
</configuration>


客户端:

namespace 抽象工厂模式
{
    class Program
    {
        /// <summary>
        /// ------------------抽象工厂模式思路----------------
        /// 1.创建一个抽象工厂和一个抽象产品()一个工厂对应一个产品
        /// 2.建立具体工厂和具体产品
        /// 客户端实现:
        /// 3.1定义抽象对象
        /// 3.2读取配置文件
        /// 3.3反射实例(实例是ICreateFactory的子类-转换为父类)
        /// 3.4反射实例(实例化对象后返回类型为具体产品对应的对象(Icar的子类)---在子类出现的地方父类一定能出现)
        /// 3.5调用其方法
        /// (新增加同种产品不需要修改源代码,直接创建相应的具体工厂和具体产品)
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            ICar iCar;//抽象产品 抽象的Car
            ICreateFactory createFactory;//抽象工厂
            try
            {
                string str = ConfigurationManager.AppSettings["FactoryInstance"];//读取配置文件
                //3.4反射实例(实例化对象后返回类型为具体产品对应的对象(Icar的子类)---(依赖倒转原则)在子类出现的地方父类一定能出现)
                createFactory = Assembly.Load("抽象工厂模式").CreateInstance(str) as ICreateFactory;

                iCar = createFactory.CreateCar();//--创建好的对象 赋值给父类Icar(如:BMW是ICar滴子类)----具体产品
                iCar.Drive();//开车的方法

                Console.ReadKey();
            }
            catch(Exception e)
            {
                Console.Write("代码出错了!!!\r\n"+e.ToString());
                Console.ReadKey();
            }
        }
    }
}


结果:创建宝马车。。。 宝马车正在行驶

如果要添加新的类 比如: 

现在有新的车子 奔驰 怎么添加呢?

代码如下:

1.定义奔驰车:

 

namespace 抽象工厂模式
{
    /// <summary>
    /// 奔驰车
    /// </summary>
    class Benz:ICar
    {
        public void Drive()
        {
            Console.Write("奔驰正在行驶。。。\r\n");
        }
    }
}

2.奔驰的工厂--用来创建奔驰车

namespace 抽象工厂模式
{
    class BenzFactory:ICreateFactory
    {
        public ICar CreateCar()
        {
            Console.Write("创建奔驰车。。\r\n");
            return new Benz();
        }
    }
}


3.配置文件修改下就行了 ---客户端(前台不用修改代码)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="FactoryInstance" value="抽象工厂模式.BenzFactory"/>
    </appSettings>
</configuration>


继续学习中。。。。。。。

 

 

 

 

 

 

转载于:https://www.cnblogs.com/StoneSH/archive/2013/04/04/2999649.html

上一篇:Tomcat与SpringMVC结合分析(一)


下一篇:【CF 1143A】The Doors