本文为转载,原文C#实现设计模式 —— 工厂模式
定义
工厂模式
主要是为创建对象提供接口,将创建对象的过程隔离起来,实现了创建者与调用者的分离,提高了程序的灵活性。
-
核心本质:
实例化对象,用工厂方法代替new操作。
将选择实现类、创建对象统一管理和控制,从而将调用者跟我们实现类解耦。 -
工厂模式分类:
简单工厂模式(Simple Factory)
工厂方法模式(Factory Method)
抽象工厂模式(Abstract Factory)
简单工厂模式
又称为静态工厂方法模式用来生产同一等级结构中的任意产品,通过 建立一个工厂(一个函数或一个类方法)来制造新的对象。
模式组成结构
-
抽象产品
: 它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。 -
具体产品
: 工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。 -
工厂类
: 这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现
示例代码
抽象产品:
public interface ICar
{
void Run();
}
具体产品
public class Bmw : ICar
{
public void Run()
{
Console.WriteLine("bmw is runing");
}
}
public class Audi : ICar
{
public void Run()
{
Console.WriteLine("audi is runing");
}
}
工厂类:
public class CarFactory
{
public ICar CreateCar(string type)
{
switch (type)
{
case "audi":
return new Audi();
case "bmw":
return new Bmw();
default:
return null;
}
}
}
调用方:
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("=================设计模式测试=================");
Console.WriteLine("====1 - 简单工厂模式==========================");
Console.WriteLine("==============================================");
Console.Write("请输入编号:");
string num = Console.ReadLine();
switch (num)
{
case "1":
SimpleFactory();
break;
default:
break;
}
Console.WriteLine("\r\n");
}
}
static void SimpleFactory()
{
CarFactory carFactory = new CarFactory();
ICar audi = carFactory.CreateCar("audi");
audi.Run();
ICar bmw = carFactory.CreateCar("bmw");
bmw.Run();
}
结果:
[图片上传失败...(image-1951d0-1513674662727)]
以上便是简单工厂模式, 但是工厂部分好像不太理想,因为每增加一种新型车,都要在工厂类中增加相应的创建业务逻辑,这显然是违背开闭原则的 。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类或者上帝类。
于是工厂方法模式出现了。 工厂类定义成了接口,而每新增的车种类型,就增加该车种类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码。
工厂方法模式
工厂方法模式
是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。
模式组成结构:
-
抽象产品
: 它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。 -
具体产品
: 工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。 -
抽象工厂
: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。 -
具体工厂
: 它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
示例代码
抽象产品:
public interface ICar
{
void Run();
}
具体产品
public class Bmw : ICar
{
public void Run()
{
Console.WriteLine("bmw is runing");
}
}
public class Audi : ICar
{
public void Run()
{
Console.WriteLine("audi is runing");
}
}
抽象工厂:
public interface ICarFactory
{
ICar CreateCar();
}
具体工厂:
public class AudiFactory : ICarFactory
{
public ICar CreateCar()
{
return new Audi();
}
}
public class BmwFactory : ICarFactory
{
public ICar CreateCar()
{
return new Bmw();
}
}
调用方:
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("=================设计模式测试=================");
Console.WriteLine("====1 - 简单工厂模式==========================");
Console.WriteLine("====2 - 工厂方法模式==========================");
Console.WriteLine("==============================================");
Console.Write("请输入编号:");
string num = Console.ReadLine();
switch (num)
{
case "1":
SimpleFactory();
break;
case "2":
FactoryMethod();
break;
default:
break;
}
Console.WriteLine("\r\n");
}
}
static void FactoryMethod()
{
FactoryMethod.ICar audi = new FactoryMethod.AudiFactory().CreateCar();
audi.Run();
FactoryMethod.ICar bmw = new FactoryMethod.BmwFactory().CreateCar();
bmw.Run();
}
运行结果:

工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。正如上面所说,这样便分担了对象承受的压力;而且这样使得结构变得灵活 起来——当有新的产品产生时,只要按照抽象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已有的代 码。可以看出工厂角色的结构也是符合开闭原则的!
网友评论