zoukankan      html  css  js  c++  java
  • 设计模式学习笔记工厂方法

    概述:                                                                                                       

    工厂方法(factory method):工厂方法通过一个抽象类实现了所有对产品的加工操作代码,唯独将产品的构建方法写成抽象方法。继承这个抽象类的具体类只重写其构建方法,这样就实现了对于不同被构建产品复用相同的加工操作逻辑。工厂方法适用于需要在子类中才能决定实例化哪个被操作对象,同时这些被操作对象又复用相同操作逻辑的场合。

    类图:                                                                                                                                 

    代码示例:                                                                                                  

    1.工厂里的产品抽象类

        /// <summary>
    /// 工厂里的产品抽象类
    /// </summary>
    public abstract class Product{}

    2.具体的产品

        /// <summary>
    /// 具体的产品
    /// </summary>
    public class ConcreteProduct : Product{}

    3.创建含有工厂方法的抽象业务类

        /// <summary>
    /// 含有工厂方法的抽象业务类
    /// </summary>
    public abstract class Creator
    {
    void FactoryMethod();
    }

    4.具体的工厂方法实现类

        /// <summary>
    /// 具体的工厂方法实现类
    /// </summary>
    public class ConcreteCreator : Creator
    {
    void FactoryMethod();
    }

    其他示例:                                                                                                  

    步骤很简单,为了防止自己忘记,从博客园里摘抄噬菌体大哥的一个例子,稍微改进一下便于理解

    工厂方法模式

    View Code
        ///
    /// 产品接口
    ///
    public abstract class IProduct
    {
    public abstract void Behavior();
    }
    ///
    /// A类型产品
    ///
    class ProductA : IProduct
    {
    public override void Behavior()
    {
    Console.WriteLine(
    "产品A的行为");
    }
    }
    ///
    /// B类型产品
    ///
    class ProductB : IProduct
    {
    public override void Behavior()
    {
    Console.WriteLine(
    "产品B的行为");
    }
    }
    ///
    /// 含有工厂方法的抽象业务类
    ///
    public abstract class ACreator
    {
    public abstract IProduct FactoryMethod();

    public void OpreateMethod()
    {
    IProduct product
    = FactoryMethod();

    //对product的一系列操作
    }
    }

    ///
    /// 生产A类型产品的具体业务类
    ///
    public class CreatorA : ACreator
    {
    public override IProduct FactoryMethod()
    {
    return new ProductA();
    }
    }

    ///
    /// 生产B类型产品的具体业务类
    ///
    public class CreatorB : ACreator
    {
    public override IProduct FactoryMethod()
    {
    return new ProductB();
    }
    }

     客户端调用:

                ACreator create = new CreatorA();
    IProduct product
    = create.FactoryMethod();
    product.Behavior();

    补充TerryLee的例子                                                                                  

    原始错误已经更正过来

    View Code
    namespace DesignPatternLab.FactoryMethodPackage
    {
    class FactoryMethodSample4
    {
    }
    /// <summary>
    /// 定义抽象接口
    /// </summary>
    public abstract class Log
    {
    public abstract void Write();
    }
    /// <summary>
    /// 具体实现类
    /// </summary>
    public class EventLog : Log
    {
    public override void Write()
    {
    Console.WriteLine(
    "EventLog Write Success"); ;
    }
    }
    /// <summary>
    /// 具体实现类
    /// </summary>
    public class FileLog : Log
    {
    public override void Write()
    {
    Console.WriteLine(
    "FileLog Write Success");
    }
    }
    /// <summary>
    /// 定义抽象方法接口
    /// </summary>
    public abstract class LogFactory
    {
    public abstract Log Create();
    }
    /// <summary>
    /// 具体实现的实例化类
    /// </summary>
    public class EventFactory:LogFactory
    {
    public override Log Create()
    {
    return new EventLog();
    }
    }
    /// <summary>
    /// 具体实现实例化的类
    /// </summary>
    public class FileFactory : LogFactory
    {
    public override Log Create()
    {
    return new FileLog();
    }
    }
    }
    //客户端调用如下
    LogFactory factory = new EventFactory();
    Log log
    = factory.Create();
    log.Write();

      

    小结:                                                                                                       

    工厂模式应用的非常多,希望记住,能熟练应用,最起码面试的时候能写出来


  • 相关阅读:
    power designer 绘制E-R 图
    git 的证书重新设置,以及如何让git 记住提交的用户名和密码
    weblogic的安装和注意的问题以及在idea怎么用weblogic启动一个web服务
    java的URI和URL到底是什么
    怎么把centos虚拟机zip文件导入vm虚拟机中
    gogole调试请求体的数据怎么知道
    Javascript数据类型——number类型
    Javascript类型——boolean类型
    Javascript数据类型——undefined和null的异同
    第3章,基本概念
  • 原文地址:https://www.cnblogs.com/jqbird/p/2144085.html
Copyright © 2011-2022 走看看