c#设计模式2——创建型模式_工厂方法模式

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();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值