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

  • 相关阅读:
    Maven 集成Tomcat插件
    dubbo 序列化 问题 属性值 丢失 ArrayList 解决
    docker 中安装 FastDFS 总结
    docker 从容器中拷文件到宿主机器中
    db2 相关命令
    Webphere WAS 启动
    CKEDITOR 4.6.X 版本 插件 弹出对话框 Dialog中 表格 Table 自定义样式Style 问题
    SpringMVC JSONP JSON支持
    CKEDITOR 3.4.2中 按钮事件中 动态改变图标和title 获取按钮
    git回退到远程某个版本
  • 原文地址:https://www.cnblogs.com/chenyongblog/p/3393313.html
Copyright © 2011-2022 走看看