设计模式-工厂方法模式

来源:互联网 发布:祸害成患妖成灾 网络剧 编辑:程序博客网 时间:2024/05/18 03:40

设计模式-工厂方法模式

工厂方法模式(Factory Method)是一种常用的对象创建型设计模式,是在简单工厂的基础上增加一个工厂基类,这个工厂基类可以是抽象类或者接口。

工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开放-封闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。

工厂方法模式对简单工厂模式进行了抽象。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。

这里写图片描述

它的核心结构有四个角色,分别是抽象产品;具体产品;抽象工厂;具体工厂;

个人电脑PC类就是抽象产品
Dell和IBM电脑就是具体产品
Factory是抽象工厂
DellFactory和IBMFactory是具体工厂

abstract class PC{    private string name;    public PC(string name)    {        this.name = name;    }    public virtual string Name { get { return name; } set { name = value; } }    public abstract void Describe();}class Dell : PC {    public Dell(string name) : base(name)    {    }    public override void Describe()    {        System.Console.WriteLine("I am {0} personal computer", Name);    }}class IBM : PC{    public IBM(string name) : base(name)    {    }    public override void Describe()    {        System.Console.WriteLine("I am {0} personal computer", Name);    }}abstract class Factory{    public abstract PC Create();}class DellFactory : Factory{    public override PC Create() { return new Dell("Dell"); }}class IBMFactory : Factory{    public override PC Create() { return new IBM("IBM"); }}

调用方式

            Factory df = new DellFactory(); //创建dell工厂                  PC dell = df.Create();          //创建具体的dell产品            dell.Describe();            dell.Name = "OtherDell";            dell.Describe();            System.Console.WriteLine();            PC ibm = new IBMFactory().Create();//创建IBM工厂的同时就创建具体的IBM产品            ibm.Describe();            ibm.Name = "OtherIBM";            ibm.Describe();

假如我们需要增加HP电脑,只需要再增加一个HP电脑具体类,以及HPFactory类就可以,对原有代码不会产生任何影响,也就是说“开放封闭原则”,开放是指可增加,封闭是指可修改,无论是增加或修改任何一个子类都不会影响到其他类,而简单工厂模式在增加新产品后需要修改原有的工厂方法,扩展性不好。

版权所有,转载请注明文章出处 http://blog/csdn.net/cadenzasolo

0 0