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

    简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现.

    简单工厂模式结构图:

    简单工厂模式中的角色:

    工厂(Creator)角色
    简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
    抽象产品(Product)角色
    简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
    具体产品(Concrete Product)角色
    是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

    引入实际情况:

    如果有一个住户管理系统,里面的住户类型是可变的,每一种租户类型的租金计算公式都存在差异

    例如:A类型的住户租金额=天数*单价+绩效*0.005

             B类型的住户租金额=月份*(每月价格+performance*0.001)

    分析:

    1. 商店存在共有的计算方法,这是实体商店的行为,然而他们的行为的方式不一样,所有我们抽象商店类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace SimpleFactory.App.IFactroy
    {
        
        public interface Ishop
        {
            double Getrent(int days, double dayprice, double performance);
        }
    }

    2.在抽象了商店之后,我们要对创建具体产品类,这里就是具体的类型商店,里面实现该商店的行为方法。

    创建A类型的商店

        //A类型的商店的创建
        public class Ashop:Ishop
        {
            /// <summary>
            /// /// A类型商店租金额,天数*单价+绩效*0.005
            /// </summary>
            /// <param name="days">天数</param>
            /// <param name="dayprice">每天单价</param>
            /// <param name="performance">日平均绩效</param>
            /// <returns></returns>
            public double Getrent(int days, double dayprice, double performance)
            {
                Console.WriteLine("A商店的租金算法");
                return days * dayprice + performance * 0.01;
            }
        }

    创建B类型的商店

        /// <summary>
        /// B类型的商店的创建
        /// </summary>
        public class Bshop:Ishop
        {
            
            /// <summary>
            /// B类型商店的租金=月份*(每月价格+performance*0.001)
            /// </summary>
            /// <param name="month">月数</param>
            /// <param name="monthprice">月单价</param>
            /// <param name="performance">月平均绩效</param>
            /// <returns></returns>
            public double Getrent(int month, double monthprice, double performance)
            {
                Console.WriteLine("B商店的租金算法");
                return month * (monthprice + performance * 0.001);
            }
        }

    3. 在创建号类型商店并实现方法后,思考在什么情况下如何创建那种对象,于是简单工厂模式中最核心的部分:工厂类出来了

        public class factorymethod
        {
            public Ishop CreateShow(string show)
            {
                switch (show.Trim().ToLower())
                {
                    case"ashop":
                        return new Ashop();
                    case "bshop":
                        return new Ashop();
                    default:
                        throw new Exception("该商店不存在");
                }
            }
        }

    4.     然后就根据当前的商店类型进行判断,该类型的商店应该进行哪一种算法:

        class Program
        {
            static void Main(string[] args)
            {
                Ishop As;
                factorymethod afm = new factorymethod();
                As = afm.CreateShow("ashop"); //a 类型的某商店
                double total = As.Getrent(30, 300, 2000);     //30 天/100元  日平均绩效为2000
                Console.WriteLine("该A类型商店的租金为:" + total);
    
                Console.WriteLine("=============");
    
                Ishop Bs;
                factorymethod bfm = new factorymethod();
                Bs = bfm.CreateShow("bshop"); //b 类型的某商店
                total = Bs.Getrent(3, 3000, 60000);          //3 月/4000元  月平均绩效为60000
                Console.WriteLine("该B类型商店的租金为:" + total);
                Console.ReadKey();
            }
        }

    到这里我们实现了客户要求的两种类型商店的算法的需求,但是作为一种好的设计架构,还应该考虑到后面的需求变革,如果客户现在又增加了C类型商店和D类型商店,它们的算法要求又不一样,这个时候我们就需要进行C,D类型商店的创建,并继承Ishop接口,实现里面的方法,同时还得继续修改工厂类在switc中增加case进行捕捉创建相应的商店对象,一旦出现这样的情况,是不利于程序的扩展性和项目后期的维护性的。

    优点:

    • 简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对  象的尴尬局面中摆脱出来。
    • 外界与具体类隔离开来,偶合性低。
    • 明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

    缺点:

    • 工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则 
    • 虽然简单工厂模式能够适应一定的变化,但是它所能解决的问题是远远有限的。它所能创建的类只能是事先教考虑到的,如果需要添加新的类,则就需要改变工厂类了。
  • 相关阅读:
    python 执行sql得到字典格式数据
    python爬虫 url链接编码成gbk2312格式
    windows环境下elasticsearch安装教程(单节点)
    python SQLServer 存储图片
    爬虫的本质是和分布式爬虫的关系
    requests form data 请求 爬虫
    mysql 删除 binlog 日志文件
    查看mysql数据表的大小
    xshell 连接报错 Disconnected from remote host
    centos 7.3 安装 mysqldb 报错 EnvironmentError: mysql_config not found ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
  • 原文地址:https://www.cnblogs.com/heyangyi/p/8531043.html
Copyright © 2011-2022 走看看