大话设计模式读书笔记7——工厂方法模式

工厂方法模式

工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。

工厂方法模式UML结构图

工厂方法模式结构代码

    /// <summary>
    /// 声明‘Product‘ 抽象类
    /// </summary>
    abstract class Product
    {
    }

    /// <summary>
    /// 声明 ‘ConcreteProductA‘ 类,继承Product
    /// </summary>
    class ConcreteProductA : Product
    {
    }

    /// <summary>
    ///  声明 ‘ConcreteProductB 类,继承Product
    /// </summary>
    class ConcreteProductB : Product
    {
    }

    /// <summary>
    /// 声明 ‘Creator‘ 抽象类
    /// </summary>
    abstract class Creator
    {
        //工厂方法
        public abstract Product FactoryMethod();
    }

    /// <summary>
    /// 声明 ‘ConcreteCreatorA‘ 类,继承Creator类
    /// </summary>
    class ConcreteCreatorA : Creator
    {
        //实现父类工厂方法返回类ConcreteProductA实例
        public override Product FactoryMethod()
        {
            return new ConcreteProductA();
        }
    }

    /// <summary>
    ///  声明 ‘ConcreteCreatorB‘ 类,继承Creator类
    /// </summary>
    class ConcreteCreatorB : Creator
    {
        //实现父类工厂方法返回类ConcreteProductB实例
        public override Product FactoryMethod()
        {
            return new ConcreteProductB();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Creator[] creators = new Creator[2];
            creators[0] = new ConcreteCreatorA();
            creators[1] = new ConcreteCreatorB();
            foreach (Creator creator in creators)
            {
                Product product = creator.FactoryMethod();
                Console.WriteLine("Created {0}",product.GetType().Name);
            }
            Console.ReadKey();
        }
    }

执行结果:

工厂模式实例代码

     /// <summary>
    /// 运算类
    /// </summary>
   public class Operation
    {
        public double NumA { get; set; }

        public double NumB { get; set; }

        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }

    /// <summary>
    /// 加法类
    /// </summary>
   public class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumA + NumB;
            return result;
        }
    }

    /// <summary>
    /// 减法类
    /// </summary>
    public class OperationSub : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumA - NumB;
            return result;
        }
    }

    /// <summary>
    /// 工厂接口
    /// </summary>
    public interface IFactory
    {
        Operation FactoryMethod();
    }

    /// <summary>
    /// 加法工厂
    /// </summary>
    public class AddFactory : IFactory
    {
        public Operation FactoryMethod()
        {
            return new OperationAdd();
        }
    }

    /// <summary>
    /// 减法工厂
    /// </summary>
    public class SubFactory : IFactory
    {
        public Operation FactoryMethod()
        {
            return new OperationSub();
        }
    }

   class Program
    {
        static void Main(string[] args)
        {
            IFactory[] fac = new IFactory[2];
            fac[0] = new AddFactory();
            fac[1] = new SubFactory();

            Operation oper;
            oper = fac[0].FactoryMethod();
            oper.NumA=10;
            oper.NumB=5;
            Console.WriteLine("Called By {0}", oper.GetType().Name);
            Console.WriteLine("Result={0}", oper.GetResult().ToString());

            oper = fac[1].FactoryMethod();
            oper.NumA = 10;
            oper.NumB = 5;
            Console.WriteLine("Called By {0}", oper.GetType().Name);
            Console.WriteLine("Result={0}", oper.GetResult().ToString());

            Console.ReadKey();
        }
    }

运行结果:

简单工厂模式和工厂方法模式的区别

简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。如想要加功能,本来是改工厂类的,而现在是修改客户端。

时间: 2024-08-28 06:36:07

大话设计模式读书笔记7——工厂方法模式的相关文章

大话设计模式读书笔记4——模版方法模式

模板方法是一种常见的设计模式,它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. UML图: 具体实现代码: namespace TemplateMethod { class Program { static void Main(string[] args) { AbstractClass A = new ConcreteClassA(); A.TemplateMethod(); AbstractClass B = new

设计模式那点事读书笔记(1)----工厂方法模式

工厂方法模式: 定义一个创建产品对象的工厂接口,让子类决定实例化哪种实例对象,将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品创建. 解决什么问题: 当子类型可能会有很多,以后需要不断添加不同子类的实现. 当一个系统尚在框架设计阶段,还不知道将来需要实例化那些具体类时. 系统设计之初不需要具体对象的概念. UML: 代码结构: 代码: 定义抽象产品: package com.demo.factory.model; /** * 定义抽象商品 */ public abstract

菜鸟学设计模式系列笔记之工厂方法模式

工厂方法模式(Factory Method): Alias :virtual constructory 虚构造器 Intent: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method使一个类的实例化延迟到其子类. Motivation:一个框架使用抽象类定义和管理对象之间的关系.这个框架负责去创建这些对象. 工厂方法模式是类的创建模式,又叫做虚拟构造子模式(Virtual Constructor)或者多态性(Polymorphic Factory)工厂模式 工厂方法

大话设计模式读书笔记--19.责任链模式

定义 责任链模式定义: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 比如: 员工小张向组长申请加薪, 组长没这个权利并将请求告诉部长,部长同意了小张的加薪请求 模式结构 代码实现 场景: 经理可以批准请假, 经理的上级是总监, 总监可以批准加薪 代码实现:点击下载 优点 1.客户端不知道哪一个对象最终处理请求,在不影响客户端的情况下可以动态的重新组织和分配责任 2.链中的对象并不知道链的结构,只需保持

大话设计模式读书笔记1——简单工厂模式

最近几日,重温了一下<大话设计模式>这本书,当时读的仓促,有很多没有注意的地方,现在仔细翻看起来,发现这值得细细品味的一本书!! 好东西就要记下来!!! 第一章笔记:从一个简单的计算器程序来看简单工厂模式. 变化的地方就要封装,用一个单独的类来做创造实例的过程这就是工厂. UML图: /// <summary> /// 运算类 /// </summary> public class Operation { public double Number1 { get; set

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///

易学设计模式看书笔记(3) - 工厂方法模式

二.工厂方法模式 1.动物管理系统的例子 首先,抽象的动物类和具体的动物实现类: public interface Animal{ public void eat(); } public class Tiger implements Animal { public void eat(){ sysout.out.println("老虎会吃"); }; public void run(){ sysout.out.println("老虎会跑"); }; } public

大话设计模式读书笔记2——单例模式

单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 我们来看一下单例模式下的饿汉模式代码: /// <summary> /// 饿汉模式 /// </summary> public class Singleton { //私有的构造器 private Singleton() {

设计模式(二)---工厂方法模式

设计模式(二)---工厂方法模式 工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品. 抽象工厂源代码 public interface Creator { /** * 工厂方法 */ public Product factory(); } 抽象产品