设计模式-简单工厂

定义

百度文库:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

标准定义:简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

基本简介

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一类产品(这些产品继承自一个产品的父类或者接口)的实例,该模式包含的角色和职责。

(1)工厂(Creator)角色

简单工厂模式的核心,他负责实现创建所有实例的内部逻辑。工厂类的创建产品类方法可以直接被外界调用,创建所需的产品对象。

(2)抽象产品(Product)角色

简单工厂模式所创建所有对象的父类,他负责描述所有实例所共有的公共接口。

(3)具体产品(Concrete Product)角色

简单工厂模式的创建目标,所有创建的对象都是充当这个角色某个具体类的实例。

UML图

示例1

抽象产品的简单工厂

(1.1)抽象产品

     /// <summary>
    /// 抽象产品
    /// </summary>
    public abstract class Product
    {
        public abstract void Create();
    }

(1.2)具体产品ProductA,ProductB

    /// <summary>
    /// 具体产品A
    /// </summary>
    public class ProductA : Product
    {
        public override void Create()
        {
            Console.WriteLine("create product_A");
        }
    }

    /// <summary>
    /// 具体产品B
    /// </summary>
    public class ProductB : Product
    {

        public override void Create()
        {
            Console.WriteLine("create product_B");
        }
    }

(1.3)工厂创建

    /// <summary>
    /// 工厂类,根据参数判断创建何种实例
    /// </summary>
    public class CreateFactory
    {
        public static Product InstanceCreater(string type)
        {
            switch (type)
            {
                case "ProductA":
                    return new ProductA();
                case "ProductB":
                    return new ProductB();
                default:
                    throw new NotImplementedException();
            }
        }
    }

(1.4)实例调用

 Product product = CreateFactory.InstanceCreater("ProductA");

示例2

(2.1)概念产品计算器类

     /// <summary>
    /// 计算类
    /// </summary>
    public class Operation
    {
        /// <summary>
        /// 数字A
        /// </summary>
        public double NumberA { get; set; }
        /// <summary>
        /// 数字B
        /// </summary>
        public double NumberB { get; set; }

        /// <summary>
        /// 得到运算结果
        /// </summary>
        /// <returns></returns>
        public virtual double CalcResult()
        {
            double result = 0;
            return result;
        }
    }

(2.2)具体操作eg:加法,减法

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

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

(2.3)工厂计算器方法

     /// <summary>
    /// 工厂计算方法类
    /// </summary>
    public class OperationFactory
    {
        public static Operation GetOperationInstance(string operate)
        {
            Operation opera = null;
            switch (operate)
            {
                case "+":
                    opera = new OperationAdd();
                    break;
                case "-":
                    opera = new OperationSub();
                    break;
                default:
                    throw new NotImplementedException();
            }
            return opera;
        }
    }

(2.4)调用

     Operation operation = OperationFactory.GetOperationInstance("+");
     operation.NumberA = 10;
     operation.NumberB = 10;
     Console.WriteLine(operation.CalcResult());        

  

深入分析

简单工厂解决的问题是如何如何去实例化一个合适的对象

简单工厂核心思想有一个专门的类负责创建实例的过程

具体来说把产品看成一系列类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树,而工厂类用来产生一个合适的对象满足客户的需求。如果简单工厂模式所涉及的具体产品之间没有共同的逻辑,那么我们就可以使用接口来扮演抽象产品的角色,如果具体产品之间有相似的功能或逻辑,我们就把这些相似的逻辑提取出来放到抽象类中。然后具体产品继承抽象类,为了实现更好的复用,共同或者重复的东西应该抽象出来。

优缺点

(1)优点

工厂类是整个模式的关键所在,它包含必要的判断逻辑,能够根据外界的指定条件实例化相应具体产品,用户在使用时可以直接根据工厂类创建所需要的实例,无需了解对象是如何创建以及如何组织的。有利于软件结构体系优化。

(2)缺点

由于工厂类集中了所有类的创建逻辑,这就导致一旦这个工厂出现问题,所有的客户端都收到牵连。由于简单工厂模式的产品基于一个共同的抽象类后者接口,这样一来,当产品种类增加的时候

总结:

简单工厂模式分离产品的创建者和消费者,有利于软件系统的机构化;但犹豫一切逻辑都集中在工厂类中,导致了没有很高的内聚性,同时也违背了开放封闭原则。另外,简单工厂模式的方法一般是静态的,而静态工厂方法是无法让子类继承的,因此简单工厂无法形成基于基类的继承树结构。

原文地址:https://www.cnblogs.com/mongo/p/4493910.html