【大话设计模式】——简单工厂模式

一、概念

  简单工厂模式(Simple Factory Pattern)属于创建型模式,又叫做静态工厂方法模式(Static FactoryMethod Pattern),可是不属于23GOF设计模式之中的一个。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

二、UML图

  简单工厂主要分为三个角色:工厂(Creator)角色、抽象产品(Product)角色、详细产品(Concrete Product)角色。

  工厂角色:该模式核心,它负责创建全部实例的内部逻辑。工厂类能够被外界直接调用。创建所须要的产品。

  抽象产品角色:所创建的全部对象的父类,它负责描写叙述全部实例所共同拥有的公共接口。

详细产品:该模式的创建目标,全部创建的对象都是充当这个角色的某个详细类的实例。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ21laTQ5Njg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

三、实例解析

  下面是我自己想的一个简单工厂模式场景。假设有不妥的地方还请大家指出。

  我做的是一个简易的网吧收费系统。CashFactory充当的是工厂的角色,它会告诉我们怎样创建白天收费方式和晚上收费方式,须要实例化哪些对象,须要什么參数;详细产品 白天、晚上 收费方法。通过override,实现了从基类继承成员的新实现。网吧收费抽象类 为白天和晚上 收费方式的父类,描写叙述了两者的公共接口。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ21laTQ5Njg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

代码例如以下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class 简易网吧收费系统 : Form
    {
        public 简易网吧收费系统()
        {
            InitializeComponent();
        }

        //窗口启动的时候载入收费方式,是晚上收费,还是白天收费
       private void Form1_Load(object sender, EventArgs e)
        {
            cbxTimeType.Items.AddRange(new object[] { "白天", "晚上" });//在时间段的选择框里载入收费选项  白天。晚上
            cbxTimeType.SelectedIndex = 0;//索引从0開始,从下往上依次递增
        }

        //单击開始button之后,收费系统開始计时
       private void btnOK_Click(object sender, EventArgs e)
       {
           lbxList.Items.Add(cbxTimeType .Text );
           txtStartTime.Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");//開始时间文本框获取開始时间
           lbxList.Items.Add("開始时间:" + txtStartTime.Text);//同一时候在以下的列表框中载入開始时间信息
       }

        //单击停止button后,收费系统停止计时
        private void btnStop_Click(object sender, EventArgs e)
        {
            txtEndTime.Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
            lbxList.Items.Add("结束时间:" + txtEndTime.Text);

        }  

       //单击结账button,系统開始结账
        private void btnCharge_Click(object sender, EventArgs e)
        {
            double timeThrough = 0.0d;//定义一个变量timeThrough代表花费的时间(小时)
            DateTime DateTime1, DateTime2;//定义两个时间变量
            DateTime1 = Convert.ToDateTime(txtStartTime.Text);//把文本框中的时间从字符串格式转换成时间格式
            DateTime2 = Convert.ToDateTime(txtEndTime.Text);

            string DateDiff = null;//定义变量时间差(x天x小时x分钟x秒)

            TimeSpan ts1 = new TimeSpan(DateTime1.Ticks);
            TimeSpan ts2 = new TimeSpan(DateTime2.Ticks);
            TimeSpan ts = ts1.Subtract(ts2).Duration();

            //计算时间差
            DateDiff = ts.Days.ToString() + "天" + ts.Hours.ToString() + "小时" + ts.Minutes.ToString() + "分钟" + ts.Seconds.ToString() + "秒";
            timeThrough = Convert.ToDouble (ts.Days.ToString ()) * 24 + Convert.ToDouble (ts.Hours.ToString()) + Convert.ToDouble (ts.Minutes.ToString()) / 60 +Convert.ToDouble ( ts.Seconds.ToString() )/ 3600;
            lbxList.Items.Add("通过时间:" + DateDiff);

            //利用简单工厂模式依据下拉选择框,生成对应的对象。
            BarCharge  barCharge = CashFactory.createCashAccept(cbxTimeType.SelectedItem.ToString());
            double money = 0d;
            money = barCharge.acceptCash(Convert.ToDouble(timeThrough) * 2);
            lbxList.Items.Add("需要支付上网的费用:" + money +"元");//通过多态,能够得到收取费用的结果
        }

    }

    //创建一个网吧现金收取的抽象类
     abstract class BarCharge
     {
         public abstract double acceptCash(double money);//收取现金,參数为原价。返回为当前价
     }

    //网吧的收费机制分为白天和晚上收费两种情况

     class Day : BarCharge //白天收费情况
     {
         public override double acceptCash( double money)
         {
             return money  ;//白天收费,返回钱数
         }
     }

     class Night : BarCharge //晚上收费情况
     {
         private double moneyRebate = 1d;

         //晚上收费。初始化必需要输入收费条件,晚上优惠率
         public Night(string moneyRebate)
         {
             this.moneyRebate = double.Parse(moneyRebate);
         }
         //晚上收费=晚上收费*优惠率
         public override double acceptCash(double money)
         {

             return money * moneyRebate ;
         }
     }

    //现金收费工厂类
     class CashFactory
     {
         public static BarCharge createCashAccept(string type)
         {
             BarCharge bc = null;
             switch (type)//依据条件返回白天和晚上收费情况
             {
                 case "白天":
                     bc = new Day();//实例化对象
                     break;
                 case "晚上":
                     bc = new Night("0.8");//给出必要參数
                     break;
             }
             return bc;
         }
     }

}

执行结果:

简单工厂攻克了对象的创建问题,免除了直接创建对象的步骤,实现了责任的切割。

可是因为工厂本身包含了全部的收费方式。每次维护或者扩展收费方式都要修改这个工厂,以至于代码须要又一次编译部署。这样违背了开放-封闭原则。

四、感受

  走别人的的路,不如自己 to do (不如的意思是更)。

先敲书上的样例,第一遍或许不懂,第二遍就清晰非常多。第三遍就认为自己能写点东西出来。不要总是认为自己看不懂,学不好,仅仅有先学了才干更好。没有之前的8个馒头,就没有第9个馒头的饱(好撑啊~~)。

时间: 2024-10-22 01:24:22

【大话设计模式】——简单工厂模式的相关文章

1.大话设计模式-简单工厂模式

编程时一门技术,更是一门艺术 简单工厂模式利用面向对象方式通过继承.封装.多态把程序的耦合度降低,设计模式使得程序更加灵活,容易修改,易于复用. 下面是服务器计算器代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <s

大话设计模式-简单工厂模式

/// <summary> /// 运算类 /// </summary> public class Operation { private double _numberA = 0; private double _numberB = 0; /// <summary> /// 数字A /// </summary> public double NumberA { get { return _numberA; } set { _numberA = value; }

学习大话设计模式02_工厂模式 进阶至 策略模式

1 /** 2 * 现金收费抽象类 3 * @author Monica 4 * 5 */ 6 public abstract class CashSuper { 7 /** 8 * 现金收取超类的抽象方法 9 * @param money 收取现金,参数为原价 10 * @return 返回当前价 11 */ 12 public abstract double acceptCash(double money); 13 } 14 15 /** 16 * 正常收费子类 17 * @author M

设计模式- 简单工厂模式、工厂方法模式及其比较

简单工厂模式及实例 前言工大有许多同学是做java的,大家都知道java最大的优点是它的完全OO化和它在多年的发展过程中吸收和总结了许多先进的框架与模式,其中工厂模式就是最常用的模式之一.下面我想将我在学习和实践过程中对工厂模式的认识与了解介绍给大家.由于笔者能力限制,在实践中也没参与过什么大的项目,笔者参与过的项目用到的工厂模式主要是简单工厂模式(Simple Factory)和工厂方法模式(Factory Method),所以笔者在本文主要介绍的是这两种模式.准备知识在OO设计领域,我们知道

Java研究之学习设计模式-简单工厂模式详解

 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 类图: 从UML类图中,可以看出,简单工厂模式的意思,就是把一个类内部,需要生成的部分,提取出来,变为一个工厂,通过工厂来new对象. 假设我们要吃苹果了,我们可以在代码中new一个苹果出来:当我们需要吃香蕉了,我们在代码中new一个香蕉出来.这种做法你会不会觉得麻烦

PHP经典设计模式--简单工厂模式

PHP经典设计模式--简单工厂模式 pfinal介绍 本来我们要获取一个类的实例,需要用到new关键字.但是如果new 直接写到业务代码里,一个类在很多地方都实例化过,以后要是这个类出了什么问题,比如要改个名字(实际中,你更多的可能是修改构造函数方法),那么就尴尬了,需要改很多地方. 工厂模式,顾名思义,就是不用new来获得实例,而是把业务类放进一个工场类里,由工厂(类)『生产』出对应的实例. 实现 SimpleFactory.php <?php namespace DesignPatterns

Python 设计模式--简单工厂模式

简单工厂模式(Factory Pattern)是一种创建型的设计模式,像工厂一样根据要求生产对象实例. 特点:根据不同的条件,工厂实例化出合适的对象. <大话设计模式>中实例:四则运算计算器 代码: 1 #!/usr/bin/env python 2 #-*- coding: utf-8 -*- 3 4 class Operation: 5 def getResult(self): 6 pass 7 8 class OperationAdd(Operation): 9 def getResul

《大话设计模式》——工厂模式的逐步升级

大话设计模式是面向对象编程的进一步的剖析,等自己学过设计模式之后,才知道面向对象编程的几大大特征-抽象.封装.继承.多态的妙用.设计模式可以说是将这几大特征玩转的淋漓尽致啊.这几天学了设计模式中的工厂模式,觉得有必要总结一下,下面我来谈谈简单工厂模式,工厂方法模式,抽象工厂模式的特点. 一.简单工厂模式 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个子类类(这些子类继承自一个父类或接口)的实例.在父类中定义了一个虚拟的方法,让子类去继承父类,然后到子类中再去重写虚拟的方法

设计模式—简单工厂模式

设计模式之简单工厂模式 看书学习设计模式,书本来源<大话设计模式>,啃一啃怎么样设计程序 在"大话"这本书中写简单工厂模式用计算器为例来说明,其实是最简单的面向接口的编程思维,不依赖与具体的实现,而重点考虑接口.这是比较重要的思维上的转变. 重点: 1.通过继承,造成多态属性,然后在子类中实现父类的接口,在不同的子类中进行不同的接口实现.直接调用实现的接口方法得到最后的值,这一种思维够趣味 2.做增量,尽量不修改之前的,靠增加代码来更改需求 3.最通俗的说法,高内聚,低耦合

JAVA 设计模式 简单工厂模式

用途 简单工厂模式 (Simple Factory) 又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例. 简单工厂模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 但是简单工厂模式不属于23种Gof设计模式之一. 结构 如何实现一个具有加减乘除基本功能的计算器? 对于这四种运算来说,都需要两个操作数,差别仅在于返回的结果不同. 由此,我们可以抽象化它们的共性,提炼出一个父类.这个类中包含