zoukankan      html  css  js  c++  java
  • 设计模式-创建者模式-简单工厂模式

    一、对工厂模式的理解

    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

  • 相关阅读:
    AOP入门之静态代理
    C# 6 与 .NET Core 1.0 高级编程
    C# 6 与 .NET Core 1.0 高级编程
    C# 6 与 .NET Core 1.0 高级编程
    C# 6 与 .NET Core 1.0 高级编程
    C# 6 与 .NET Core 1.0 高级编程
    C# 6 与 .NET Core 1.0 高级编程
    C# 6 与 .NET Core 1.0 高级编程
    C# 6 与 .NET Core 1.0 高级编程
    C# 6 与 .NET Core 1.0 高级编程
  • 原文地址:https://www.cnblogs.com/chenyongblog/p/3393313.html
Copyright © 2011-2022 走看看