Fork me on GitHub

设计模式-创建者模式-简单工厂模式

 

一、对工厂模式的理解

1、简单工厂模式属于类的创建模式,又称静态工厂方法模式;

2、通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都是具有共同的父类;

3、角色

  3.1 工厂角色-Creator:它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需的产品对象;

  3.2 抽象角色-Product:简单工厂模式所创建的所有对象的父类,它负责描述所有实例共有的公共接口;

  3.3 具体产品-Concrete Product:简单工厂模式所创建的具体实例对象;

二、简单工厂模式

简单工厂只是一个方法,根据参数的不同来初始化不同的类。

    interface IProduct
    {
        void Product();
    }
    class ProductA:IProduct
    {
        public void Product()
        {
            Console.WriteLine("ProductA");
        }
    }
    class ProductB:IProduct
    {
        public void Product()
        {
            Console.WriteLine("ProductB");
        }
    }
    class Factory
    {
        IProduct iproduct;
        public IProduct Product(string userOrder)
        {
            switch (userOrder)
            { 
                case "A":
                    iproduct = new ProductA();
                    break;
                case "B":
                    iproduct = new ProductB();
                    break;
                default:
                    iproduct = new ProductA();
                    break;
            }
            return iproduct;
        }
    }
    class Program
    {
        static void Main( string[] args )
        {
            Console.WriteLine("用户同志:我们目前只有两条生产线只能生产A和B两种产品,请输入您需要的产品(A or B)");
            string userOrder=Console.ReadLine();
            Factory factory = new Factory();//首先实例化一个工厂
            IProduct product = factory.Product( userOrder );//创建产品角色
            product.Product();//生产具体产品
            Console.ReadLine();
            //这里客户端没有直接参与具体产品的生产,只是表达他想要啥产品
            //下一步讨论的是根据用户的输入,如果没有该产品角色那么就创建该角色,基于配置文件
        }
    }

 

效率问题:

1.如果构造一个Factory实例,在获取一个抽象类型的实例后就不再使用,资源上有些浪费,当这个获取过程十分频繁的时候,就非常浪费资源了;

解决方案:

(1)把工厂实例作为参数注入到操作中,而不是在每个方法内部自行创建--?

(2)将工厂模式设计为单件方式,这样所有的客户端程序共享唯一的Factory类型实例

三、具体的实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleFactory
{
    public class Operation
    {
        public double NumberA { get; set; }
        public double NumberB { get; set; }

        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }

    public class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA + NumberB;
            return result;
        }
    }

    public class OperationSub : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA - NumberB;
            return result;
        }
    }

    public class OperationMultiplication : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result = NumberA * NumberB;
            return result;
        }
    }

    public class OperationDivision : Operation
    {
        public override double GetResult()
        {
            if(NumberB==0)
            {
                throw new Exception("除数不能为0!!!记住啦");
            }
            else
            {
                double result = 0;
                result = NumberA / NumberB;
                return result; 
            }
        }
    }

    public class OperationFactory
    {
        public static Operation CreateOperate(string operate)
        {
            Operation oper = null;
            switch (operate)
            { 
                case "+":
                    oper=new OperationAdd();//根据传递的参数不同实例化不同的类
break; case "-": oper = new OperationSub(); break; case "*": oper=new OperationMultiplication(); break; case "/": oper = new OperationDivision(); break; } return oper; } } class Program { static void Main(string[] args) { Console.WriteLine("请输入第一个数字:"); double numberA = double.Parse(Console.ReadLine()); Console.WriteLine("请输入操作符:"); string opera = Console.ReadLine(); Console.WriteLine("请输入第二个数字"); double numberB=double.Parse(Console.ReadLine()); Operation oper = new Operation(); oper = OperationFactory.CreateOperate(opera); oper.NumberA = numberA; oper.NumberB = numberB; double result = oper.GetResult(); Console.WriteLine(result.ToString()); Console.ReadKey(); } } }

 

参考资料:  http://visualcsharp.diandian.com/post/2012-11-05/40041450121

posted @ 2013-10-29 19:50  种花生的读书人  阅读(1023)  评论(0编辑  收藏  举报

该博客仅作为记录笔记,转载随意