直截了当的告诉你什么是工厂模式

千万不要以为创建一个类,以Factory为后缀就是工厂,那不是工厂。

直接演示:

public interface IMachine
{
    string Name { get; }
    /// <summary>
    /// 机器启动
    /// </summary>
    void TurnOn();
}
public class Computer : IMachine
{
    public string Name
    {
        get { return "戴尔"; }
    }

    public void TurnOn()
    {
        Console.WriteLine("电脑启动");
    }
}
public class Mobile : IMachine
{
    public string Name
    {
        get { return "魅族"; }
    }

    public void TurnOn()
    {
        Console.WriteLine("手机启动");
    }
}
public class UnknownMachine : IMachine
{
    public string Name
    {
        get { return "机器故障" }
    }

    public void TurnOn()
    {
        Console.WriteLine("启动失败");
    }
}
class Program
{
    static void Main(string[] args)
    {
        string description = "computer";
        IMachine machine = GetMachine(description);
        machine.TurnOn();

        Console.ReadKey();
    }
    private static IMachine GetMachine(string description)
    {
        switch (description)
        {
            case "computer":
                return new Computer();
            case "mobile":
                return new Mobile();
            default:
                return new UnknownMachine();
        }
    }
}

上面代码一执行,IMachine接口里装的Computer,所以电脑启动了

工厂模式登场

public class MachineFactory
{
    private Dictionary<string, Type> _machines;

    public MachineFactory()
    {
        LoadTypesICanReturn();
    }

    public IMachine CreateInstance(string description)
    {
        Type t = GetTypeToCreate(description);

        if (t == null)
            return new UnknownMachine();

        return Activator.CreateInstance(t) as IMachine;
    }

    private Type GetTypeToCreate(string machineName)
    {
        foreach (var machine in _machines)
        {
            if (machine.Key.Contains(machineName))
            {
                return _machines[machine.Key];
            }
        }

        return null;
    }

    private void LoadTypesICanReturn()
    {
        _machines = new Dictionary<string, Type>();

        Type[] typesInThisAssembly = Assembly.GetExecutingAssembly().GetTypes();

        foreach (Type type in typesInThisAssembly)
        {
            if (type.GetInterface(nameof(IMachine)) != null)
            {
                _machines.Add(type.Name, type);
            }
        }
    }
}
static void Main(string[] args)
{
    string description = "Computer";
    IMachine machine = new MachineFactory().CreateInstance(description);
    machine.TurnOn();

    Console.ReadKey();
}

CreateInstance方法也可以设计成静态的

MachineFactory.CreateInstance(description);

在抽象一点可以让MachineFactory实现IMachineFactory接口

public interface IMachineFactory
{
    IMachine CreateInstance(string description);
}
public class MachineFactory : IMachineFactory

static void Main(string[] args)
{
    string description = "Computer";
    IMachine machine = LoadFactory().CreateInstance(description);
    machine.TurnOn();

    Console.ReadKey();
}

private static IMachineFactory LoadFactory()
{
    string factoryName = Properties.Settings.Default.DefaultMachineFactory;
    return Assembly.GetExecutingAssembly().CreateInstance(factoryName) as IMachineFactory;
}

如果没有上面的IMachineFactory接口,那么具体的工厂将与其生产的具体类型紧密耦合,我认为这也是可以接受的。好了。就是这么直截了当,简单粗暴。

时间: 2024-10-13 02:10:17

直截了当的告诉你什么是工厂模式的相关文章

直截了当的告诉你什么是策略模式

策略模式的实现也是非常简单.还是那句话,直截了当,废话不多说. 模拟一个计算运费的程序 /// <summary> /// 配送方式 /// </summary> public enum ShippingOptions { EMS = 0, 顺丰 = 1, 圆通 = 2, 中通 = 4, 天天 = 8, 宅急送 = 16 } public class Order { public int Id { get; set; } public ShippingOptions Shippin

程序设计模式 —— 抽象工厂模式

前言 工厂?意思是创建变量的厂子?要这个干什么?为什么不直接new new new!! 定义:为创建一组相关或相互依赖的对象提供一个接口,而无需指定他们的具体类. 但是,从现在开始,请不要再使用new. “What?不使用new?你怎么写C++程序,怎么写Java程序?” 我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是工厂模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一定必须学会C++,这些代码

Android设计模式之一个例子让你彻底明白工厂模式(Factory Pattern)

提出疑问 这几天研究工厂模式的时候,看到网上的一些文章中举的例子我就很疑惑,我相信这也是许多人的疑惑:工厂模式的功能就是创建实例,我们创建实例直接new不就完了吗,干嘛还得再封装一层工厂类,然后用工厂类再去new出这个实例?这不多此一举吗? 比如我看到这样的例子,我们的用户分为金牌用户和银牌用户,我们要创建一个金牌用户或者银牌用户. 定义一个用户接口 public interface ICustomer { String describe(); } 金牌用户实现类 public class Go

设计模式 2/23 工厂模式

工厂模式是最常用的设计模式之一,用好了,代码优雅,可维护性高,对系统设计会上一个台阶 为什么这么说,因为工厂模式可以牵扯出抽象工厂模式,也有大家都会聊到的简单工厂模式 我们要了解一点,23中设计模式中,不包含简单工厂模式,之所以大家会去聊这个,四个字,渐进明细 通过对简单工厂模式的了解,我们引入工厂这个词,不然一个写代码的,天天给他讲工厂,工厂,工厂,西厂,东厂,会晕 同时,通过逐步的深入,从简单工厂,到工厂模式,再到抽象工厂,渐进明细的过程,逐步深入的理解,比较优劣,择优而为我们所用. 试想我

设计模式的C++实现 24.简单工厂模式

简单工厂模式,又称静态工厂模式,属于创造型模式,但又不是23中GOF设计模式之一.简单工厂是由一个工厂对象决定创造出哪种产品类的实例.简单工厂模式是工厂模式中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 简单工厂通过传入的参数判断创建哪一个产品的实例,封装了对象的创建,客服端看到的只是产品的抽象对象,不关心返回子类的类型. 简单来说,简单工厂就是调用是传入一个参数来告诉工厂类要创建一个什么样的对象,然后工厂类返回这个对象. 缺点是 没添加一个产品子类,都要在工厂类中添加一个判断分支

设计模式(3)抽象工厂模式(Abstract Factory)

设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂模式一般的书面定义为:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 提供创建接口,无需指定具体实现类,这个原则在简单工厂模式和工厂方法模式篇已经反复讲到了,这是面向接口编程的一个基本准则,很显然,从抽象工厂模式的一般定义中可以看出这也是抽象工厂模式的一个核心,而抽象工厂模式的另

菜鸟之路-浅谈设计模式之工厂模式

工厂模式 工厂模式是我们最经常使用的实例化对象模式了,是用工厂方法取代new操作的一种模式. 著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统能够说是随处可见. 由于工厂模式就相当于创建实例对象的new.我们经常要依据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,能否够考虑使用工厂模式,尽管这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的改动量. 工厂模式定义 我们以类Sample为例,

工厂模式(Factory)

今天重新学习了下工厂模式:简单工厂模式.工厂方法模式.抽象工厂模式,总结下. 首先,从名字上看,三个模式都有”工厂“二字,工厂,自然是生产产品的,工厂模式就是生产类的实例的,而具体生产哪种实例,怎样生产,何时生产,这就是三种工程工厂的区别,以下先分开阐述: ①,简单工厂模式 之所以简单,我觉得在于它就一个工厂,就实现了生产实例的功能(相对于另外两种工厂模式的多个工厂,确实简单很多),具体实现中,只需要告诉该工厂要生产哪种材料(实例),它就会准确的把相应实例产出给你,用起来是很简单,但维护起来可就

详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博文,并不是像一些"非主流"的爱情观那样"宁缺毋滥". 只是其一呢,因为相当于给自己做一个总结,加深一下自己这方面的认识,因为掌握了和把它写出来我感觉后者还可以对技能有一个提升,其二呢是因为最近公司有一个内部的training需要讲设计模式. v写在前面 在这里呢,需要向