1、工厂方法模式(Factory Method Pattern)简称工厂模式:
在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
2、
工厂方法模式优点:
(1)工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节。
(2)能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。
(3)在系统中加入新产品时,完全符合开闭原则。
工厂方法模式缺点:
(1)系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销
(2)增加了系统的抽象性和理解难度
案例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _1.创建者模式_工厂方法
{ //抽象产品类
class Operation
{
private double numberA = 0;
private double numberB = 0;
//抽象产品
public double NumberA
{
get { return numberA; }
set { numberA = value; }
}
public double NumberB
{
get { return numberB; }
set { numberB = value; }
}
//虚拟抽象方法定义父类,便于定义不同子类方法继承
public virtual double GetResult()
{
double result = 0;
return result;
}
}
//具体产品
//加法类
class OperationAdd : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
//减法类
class OperationSub : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}
乘法类
class OperationMul : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}
}
//除法类
class OperationDiv : Operation
{
public override double GetResult()
{
double result = 0;
if (0 == NumberB)
{
throw new Exception("不能为0");
}
result = NumberA / NumberB;
return result;
}
}
//创建用于生产运算符的接口
//特点:所有产品属于同一大类(都继承了同一抽象类或者实现了同一接口)
interface IFactory
{ //创建运算符
Operation CreateOperation();
}
//拆分,创建自己运算符号的工厂
class AddFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
class SubFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
class MulFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationMul();
}
}
class DivFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationDiv();
}
}
class Program
{
static void Main(string[] args)
{
IFactory operFactory = new AddFactory();//通过实例化接口内的工厂来调用不同的运算
Operation oper = operFactory.CreateOperation();
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
Console.WriteLine(result);
Console.ReadKey();
}
}
}