您的位置:首页 > 其它

第三课 创建型模式 第二节 工厂方法模式(Factory Method Pattern)

2012-11-25 16:16 204 查看
一下内容整理自:工厂方法模式百度百科(http://baike.baidu.com/view/1580263.htm)、云涛的博客(http://blog.sina.com.cn/shangguanyuntao)

工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作延迟到子类。核心工厂类不再负责对象的创建工作,这个工厂类成为一个工厂接口,成为所有工厂子类必须实现的接口。

工厂方法模式四要素:

1.工厂接口:工厂接口是工厂方法模式的核心,这个接口中定义了一个方法,这个方法用来返回产品接口的实例。

2.工厂实现:工厂实现决定如何实例化产品,是实现扩展的途径。这是实现工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

3.产品接口:产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。是产品对象的共同父类或共同拥有的接口。

4.产品实现:这个角色实现了产品接口所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

工厂方法模式的应用:

1.第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。

2.只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。

工厂方法模式和简单工厂模式的区别:简单工厂模式违背了开放-封闭原则(OCP),工厂方法模式解决了简单工厂模式存在的问题。

工厂方法模式UML图:



工厂方法模式示例代码:

---------------------------------------------定义产品相关接口及类------------------------------------------------

/// <summary>

/// 定义产品接口,接口中定义了子类要实现的方法,即定义客户端可见方法

/// </summary>

public interface IMan {

string Name { get; set; }

string Sex { get; set; }

int Age { get; set; }

string Work { get; set; }

string GetInstruction();

}

/// <summary>

/// 产品子类--001

/// </summary>

public class Student:IMan {

public string GetInstruction()

{

string info = "姓名:" + Name + "\n职业:学生\n性别:" + Sex + "\n年龄:" + Age;

return info;

}

public string Name { get; set; }

public string Sex { get; set; }

public int Age { get; set; }

public string Work { get; set; }

}

/// <summary>

/// 产品子类--002

/// </summary>

public class Teacher : IMan {

public string GetInstruction()

{

string info = "姓名:" + Name + "\n职业:教师\n性别:" + Sex + "\n年龄:" + Age;

return info;

}

public string Name { get; set; }

public string Sex { get; set; }

public int Age { get; set; }

public string Work { get; set; }

}

-----------------------------------定义工厂相关接口及类---------------------------------------

/// <summary>

/// 定义工厂接口

/// </summary>

public interface IFactory {

IMan CreateMan();

}

/// <summary>

/// 为学生类定义学生工厂,用于建立学生类,将实例化子类的操作抽象到工厂中

/// </summary>

public class StudentFactory : IFactory {

public IMan CreateMan()

{

return new Student();

}

}

public class TeacerFactory : IFactory {

public IMan CreateMan()

{

return new Teacher();

}

}

----------------客户端调用------------------------

private void button1_Click(object sender, EventArgs e)

{

string name = this.txtName.Text;

int age = int.Parse(this.txtAge.Text);

string sex = this.txtSex.Text;

IFactory factory = new TeacerFactory();

IMan teacher = factory.CreateMan();

teacher.Name = name;

teacher.Age = age;

teacher.Sex = sex;

this.label8.Text = teacher.GetInstruction();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐