工厂方法模式

 1。概述

         工厂方法是一个粒度很小的设计模式,因为模式的表现只是一个抽象的方法。工厂方法主要创建与某个类相关的类的实例。

2。意图

       定义一个用于创建对象的接口(这里是一个抽象的方法),让包含这个接口的类的子类决定到底实例化哪一个类。工厂方法使一个类的实例化延迟到了子类。

3。使用场合

     当一个类不知道它具体要创建对象的类或者一个类希望由子类指定它所创建的对象时,可是使用工厂方法模式。

4。效果

     工厂方法使类中的代码不依赖它必须创建的类,代码只要知道它需要创建的类的接口。工厂方法的缺点是新增加一个需要创建的类,就需要增加一个相应的子类。

5。程序实例

      我们先看一个小的例子,这个例子主要是获得不同类的实例的迭代器。程序如下:

using  System;
using  System.Collections;
namespace  FactoryMethod2
{
    
///   <summary>
    
///  Class1 的摘要说明。
    
///   </summary>
     class  Class1
    {
        
///   <summary>
        
///  应用程序的主入口点。
        
///   </summary>
        [STAThread]
        
static   void  Main( string [] args)
        {
            
//
            
//  TODO: 在此处添加代码以启动应用程序
            
//
            ArrayList ar = new  ArrayList();
            IEnumerator e
= ar.GetEnumerator();
            System.Console.WriteLine(ar.GetType().Name
+ " 的迭代器类型 " + e.GetType().Name);
            String s
= "" ;
            IEnumerator se
= s.GetEnumerator();
            System.Console.WriteLine(s.GetType().Name
+ " 的迭代器类型 " + se.GetType().Name); 
            System.Console.ReadLine();

        }
    }
}

运行的结果如图:

6。工厂方法的结构

结构如图:

7。一个更加形象的例子---鸟生蛋

 该例子的类图如下:

下面是程序的源代码:

鸟的类,它包含一个Produce()的抽象方法

using  System;

namespace
 FactoryMethod
{
    
/// <summary>

    
///  Bird 的摘要说明。
    
/// </summary>

    public abstract class  Bird
    {
        
#region 属性

        
protected string  name;
        
#endregion

        
#region 方法
        
public  Bird()
        {
            
//

            
//  TODO: 在此处添加构造函数逻辑
            
//
        }
        
public Bird(string
 name)
        {
            
this.name=
name;
        }
        
public string
 Name
        {
            
get

            {
                
return this .name;
            }
        }
        
public abstract
 Egg Produce();
        
#endregion

    }
}

鸡的类,它从鸟类继承下来

using  System;

namespace  FactoryMethod
{
    
///   <summary>
    
///  Class2 的摘要说明。
    
///   </summary>
     public   class  Chicken:Bird
    {
        
public  Chicken()
        {
            
//
            
//  TODO: 在此处添加构造函数逻辑
            
//
             this .name = " " ;
        }
        
public   override  Egg Produce()
        {
            
return   new  ChickenEgg();
        }

    }
}

鸭子的类,从鸟类中继承

using  System;

namespace  FactoryMethod
{
    
///   <summary>
    
///  Duck 的摘要说明。
    
///   </summary>
     public   class  Duck:Bird
    {
        
public  Duck()
        {
            
//
            
//  TODO: 在此处添加构造函数逻辑
            
//
             this .name = " " ;
        }
        
public   override  Egg Produce()
        {
            
return   new  DuckEgg();
        }
    }
}

蛋类,它是一个抽象的类

using  System;

namespace  FactoryMethod
{
    
///   <summary>
    
///  Egg 的摘要说明。
    
///   </summary>
     public   class  Egg
    {
        
#region  属性
        
protected   string  name;
        
#endregion
        
#region  方法
        
public  Egg()
        {
            
//
            
//  TODO: 在此处添加构造函数逻辑
            
//
        }
        
public  Egg( string  name)
        {
            
this .name = name;
        }
        
public   string  Name
        {
            
get
            {
                
return   this .name;
            }
        }
        
#endregion
    }
}

鸡蛋的类(从蛋类继承)

using  System;

namespace
 FactoryMethod
{
    
/// <summary>

    
///  ChickenEgg 的摘要说明。
    
/// </summary>

    public class  ChickenEgg:Egg
    {
        
public
 ChickenEgg()
        {
            
//

            
//  TODO: 在此处添加构造函数逻辑
            
//
            this.name="鸡蛋"
;
        }
    }
}

鸭蛋的类(从蛋类继承)

using  System;

namespace
 FactoryMethod
{
    
/// <summary>

    
///  DuckEgg 的摘要说明。
    
/// </summary>

    public class  DuckEgg:Egg
    {
        
public
 DuckEgg()
        {
            
//

            
//  TODO: 在此处添加构造函数逻辑
            
//
            this.name="鸭蛋"
;            
        }
    }
}

客户端程序

using  System;

namespace  FactoryMethod
{
    
///   <summary>
    
///  Class1 的摘要说明。
    
///   </summary>
     class  Class1
    {
        
///   <summary>
        
///  应用程序的主入口点。
        
///   </summary>
        [STAThread]
        
static   void  Main( string [] args)
        {
            
//
            
//  TODO: 在此处添加代码以启动应用程序
            
//
            Chicken chicken = new  Chicken();
            System.Console.WriteLine(chicken.Name
+ "  生  " + chicken.Produce().Name);
            Duck duck
= new  Duck();
            System.Console.WriteLine(duck.Name
+ "  生  " + duck.Produce().Name);
            System.Console.ReadLine();

        }
    }
}

程序运行的结果如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public StringUnit() { // //TODO: 在此处添加构造函数逻辑 // } /// <summary> /// 生成随机数 /// </summary> /// <returns></returns> private string GenerateCheckCode() { #region int number; char code; string checkCode = String.Empty; System.Random random = new Random(); for (int i = 0; i < 5; i++) { number = random.Next(); if (number % 2 == 0) code = (char)('0' + (char)(number % 10)); else code = (char)('A' + (char)(number % 26)); checkCode += code.ToString(); } HttpContext.Current.Response.Cookies.Add(new HttpCookie("CheckCode", checkCode)); return checkCode; #endregion } /// <summary> /// 生成验证码图片 /// </summary> public void CreateCheckCodeImage() { #region string checkCode = GenerateCheckCode(); if (checkCode == null || checkCode.Trim() == String.Empty) return; System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22); Graphics g = Graphics.FromImage(image); try { //生成随机生成器 Random random = new Random(); //清空图片背景色 g.Clear(Color.White); //画图片的背景噪音线 for (int i = 0; i < 25; i++) { int x1 = random.Next(image.Width); int x2 = random.Next(image.Width); int y1 = random.Next(image.Height); int y2 = random.Next(image.Height); g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); } Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)); System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); g.DrawString(checkCode, font, brush, 2, 2); //画图片的前景噪音点 for (int i = 0; i < 100; i++) { int x = random.Next(image.Width); int y = random.Next(image.Height); image.SetPixel(x, y, Color.FromArgb(random.Next())); } //画图片的边框线 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ContentType = "image/Gif"; HttpContext.Current.Response.BinaryWrite(ms.ToArray()); } finally { g.Dispose(); image.Dispose(); } #endregion }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值