zoukankan      html  css  js  c++  java
  • Head First设计模式之工厂模式

    一、定义

    定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类

    二、结构

    1、抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
    2、具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
    3、抽象产品角色:它是具体产品继承的父类或者是实现的接口。
    4、具体产品角色:具体工厂角色所创建的对象就是此角色的实例。

    三、实现

    namespace DesignPatterns.FactoryMethod
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("使用工厂方法进行计算");
                Factory factory1 = new AddFactory();
                Operation operation1 = factory1.CreateOperation();
                operation1.numberA = 10;
                operation1.numberB = 20;
                Console.WriteLine("{0}+{1}={2}", operation1.numberA, operation1.numberB, operation1.GetResult());
    
                Factory factory2 = new SubFactory();
                Operation operation2 = factory2.CreateOperation();
                operation2.numberA = 10;
                operation2.numberB = 20;
                Console.WriteLine("{0}-{1}={2}", operation2.numberA, operation2.numberB, operation2.GetResult());
                Console.Read();
            }
        }
    
        /// <summary>
        /// 抽象操作类
        /// </summary>
        public abstract class Operation
        {
            public int numberA;
            public int numberB;
            public abstract int GetResult();
        }
        /// <summary>
        /// 加法操作
        /// </summary>
        public class AddOperation : Operation
        {
            public override int GetResult()
            {
                return (this.numberA + this.numberB);
            }
        }
        /// <summary>
        /// 减法操作
        /// </summary>
        public class SubOperation : Operation
        {
            public override int GetResult()
            {
                return (this.numberA - this.numberB);
            }
        }
    
        public abstract class Factory
        {
            public abstract Operation CreateOperation();
        }
    
        public class AddFactory : Factory
        {
            public override Operation CreateOperation()
            {
                return new AddOperation();
            }
        }
    
        public class SubFactory : Factory
        {
            public override Operation CreateOperation()
            {
                return new SubOperation();
            }
        }
    }

    四、适用场景

    • 类不知道自己要创建哪一个对象时
    • 类用它的子类来指定创建哪个对象
    • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候  

    五、优缺点

    优点:

    • 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够使工厂可以自主确定创建何种产品对象。而且如何创建一个具体产品的细节完全封装在具体工厂内部,符合高内聚,低耦合。
    • 在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,很好的利用了封装和委托。

    缺点:

    • 在添加新产品时,需要编写新的具体产品类(其实这不算一个缺点,因为这是不可避免的),要增加与之对应的具体工厂类。

    参考:

    http://www.cnblogs.com/yinxiangpei/articles/2366092.html

    http://www.cnblogs.com/ywqu/archive/2010/01/07/1640855.html

    http://www.cnblogs.com/Terrylee/archive/2006/01/04/310716.html

    欢迎阅读本系列文章:Head First设计模式之目录

  • 相关阅读:
    前端- css
    前端- html -总结
    2016.9.15 黑客编程之无限启动
    2016.9.14 JavaScript入门之七面向对象和函数
    2016.9.13 JavaScript入门之六基础函数
    2016.9.1 JavaScript入门之五
    2016.9.9 网络工程师之路由器技术
    2016.8.14 网络工程师之网关协议
    2016.8.27 JavaScript入门之四
    2016.8.22 JavaScript入门之三
  • 原文地址:https://www.cnblogs.com/xcsn/p/7337024.html
Copyright © 2011-2022 走看看