zoukankan      html  css  js  c++  java
  • 工厂方法模式(Factory Method Pattern)

    我们在简单工厂模式中, 将实例化对象的工作推迟到了专门负责创建对象的工厂类中,这样,在我们事先预知的情况下,可以根据我们的需要动态创建产品类。但是,我们的预知是有限的, 客户的变化可能是无限的。所以,就出现了问题,一旦客户的变化超越了我们的预知,我们就必须修改我们的源代码了。这是设计模式所不允许的,怎么办呢?工厂 方法模式正是解决此类问题的。

    定义
    工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂模式(Polymorphic Factory),在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成, 即由子类来决定究竟应该实例化(创建)哪一个类

    意图
    定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。

    参与者

    · 抽象产品角色(Product)
    定义产品的接口 

    · 具体产品角色(ConcreteProduct) 
    实现接口Product的具体产品类 

    · 抽象工厂角色(Creator) 
    声明工厂方法(FactoryMethod),返回一个产品 

    · 真实的工厂(ConcreteCreator)
    实现FactoryMethod工厂方法,由客户调用,返回一个产品的实例 

    工厂方法模式UML图

     

    实例一:

    namespace Test
    {
        public interface ICoat
        {
            void ShowCoat();
        }
        public class BusinessCoat : ICoat
        {
            public void ShowCoat()
            {
                Console.WriteLine("这件是商务上衣");
            }
        }
        public class FashionCoat : ICoat
        {
            public void ShowCoat()
            {
                Console.WriteLine("这件是时尚上衣");
            }
        }
        public interface IFactory
        {
            ICoat CreateCoat();
        }
        public class BusinessCoatFactory : IFactory
        {
            public ICoat CreateCoat()
            {
                return new BusinessCoat();
            }
        }
        public class FashionCoatFactory : IFactory
        {
            public ICoat CreateCoat()
            {
                return new FashionCoat();
            }
        }
        class Client
        {
            static void Main(string[] args)
            {
                IFactory f1 = new BusinessCoatFactory();
                IFactory f2 = new FashionCoatFactory();
                ICoat c1 = f1.CreateCoat();
                ICoat c2 = f2.CreateCoat();
                c1.ShowCoat(); c2.ShowCoat();
            }
        }
    }

    实例二:

    namespace Test
    {
        public abstract class Light
        {
            public abstract void TurnOn();
            public abstract void TurnOff();
        }
    
        public class BulbLight : Light
        {
            public override void TurnOn()
            { Console.WriteLine("Bulb Light is Turned on"); }
    
            public override void TurnOff()
            { Console.WriteLine("Bulb Light is Turned off"); }
        }
    
        public class TubeLight : Light
        {
            public override void TurnOn()
            { Console.WriteLine("Tube Light is Turned on"); }
    
            public override void TurnOff()
            { Console.WriteLine("Tube Light is Turned off"); }
        }
    
        public abstract class Creator
        {
            public abstract Light factory();
        }
    
        public class BulbCreator : Creator
        {
            public override Light factory()
            { return new BulbLight(); }
        }
    
        public class TubeCreator : Creator
        {
            public override Light factory()
            { return new TubeLight(); }
        }
    
        public class Client
        {
            public static void Main()
            {
                Creator c1 = new BulbCreator();
                Creator c2 = new TubeCreator();
    
                Light l1 = c1.factory();
                Light l2 = c2.factory();
    
                l1.TurnOn();
                l1.TurnOff();
    
                Console.WriteLine("-----------------");
    
                l2.TurnOn();
                l2.TurnOff();
            }
        }
    }
  • 相关阅读:
    存储过程分页
    SQL內置Function游标函数
    SQL 2000中的触发器使用
    使用.NET自带的功能制作简单的注册码
    在ASP.NET里轻松实现缩略图
    推荐几个用得上且免费的 .NET控件
    SQL內置Function日期和时间函数
    常用的asp代碼和javascript代碼
    SQL內置Function元数据函数
    數據庫中代@@的參數說明
  • 原文地址:https://www.cnblogs.com/xiepeixing/p/2920223.html
Copyright © 2011-2022 走看看