求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 
 

设计模式教程
简单工厂模式
AbstractFactory模式
FactoryMethod模式
Prototype模式
Singleton模式
Template Method模式
Builder模式
Class-Adapter 模式
Facade 模式
Object-Adapter 模式
Bridge模式
 
 

FactoryMethod模式
 
来源:火龙果软件   作者:俎涛
 
1250 次浏览
41次  
问题 如何提炼一个可以为多个应用建立同一结构关系,实现各个应用的继承性扩展。
环境 多个应用具有类似的结构和行为。
解决方案 抽象公共的结构和行为,建立抽象的框架层,以便各个具体应用可以继承公共行为,并根据具体应用的不同,实例化不同的子类对象。
效果 具体应用开发具有规范性和继承性。
实例 不同国家的人说不同的话。

模式类图

模式范例

下面对模式给出范例,包括:

  • 需求,采用用例模型描述
  • 设计,包括:设计类图,顺序图。
  • 实现:代码目录。
  • 运行:运行效果界面

用例模型

用例名称 Speak
用例概述 中国人可以用汉语说话,英国人可以用英语说话
基本场景 用户选择人种,
App创建选择的人种,
人种创建他的语言,
用户输入词汇,
App查找词汇,说话
备选场景 如果人种选择错误,提示没有此人种。
如果找不到,提示没有此词汇。

设计类图

类名 Person
功能 抽象类,用于建立和Language的关系
方法 说明
CreateLanguage() 抽象方法,留给子类去实现。
Speak() 具体方法,查询词汇表说话。
属性 说明

类名 Language
功能 抽象类,用于建立各种语言的公共结构
属性 说明
helloWorld 词汇记录属性
sorry 词汇记录属性

类名 Chinese
功能 实现Person,提供汉语创建方法
方法 说明
CreateLanguage() 实现汉语创建
Speak() 继承父类方法。

类名 ChineseLanguage
功能 实现Language ,建立具体的汉语词汇
方法 说明
ChineseLanguage () 构造汉语词汇表

类名 Englishman
功能 实现Person,提供英语创建方法
方法 说明
CreateLanguage() 实现英语创建
Speak() 继承父类方法。

类名 EnglishLanguage
功能 实现Language ,建立具体的汉语词汇
方法 说明
EnglishLanguage () 构造英语词汇表

顺序图:

代码目录

主程序Program.Main()

 

应用程序

class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("请选择人种:1-中国人,2-美国人 :");

            Person person = null;

            string personType = Console.ReadLine();

            switch (personType)

            {

                case "1":

                    person = new Chinese();

                    Console.WriteLine("中国人诞生了 ");

                    person.CreateLanguage();//为该人种建立语言

                    Console.WriteLine("中国人创建了汉语 ");

                    break;

 

                case "2":

                    person = new Englishman();

                    Console.WriteLine("英国人诞生了 ");

                    person.CreateLanguage();

                    Console.WriteLine("英国人创建了英语 ");

                    break;

                default:

                    Console.WriteLine("没有此种人!");

                    break;

            }

 

            string input = "";

            while (input != "Quit")

            {

                Console.Write("请输入词汇或者 Quit");

                input = Console.ReadLine();

                person.Speak(input);

 

            }

        }

抽象人、语言类组

  public abstract class Person

    {

        protected Language language;

 

        abstract public void CreateLanguage();

 

        public void Speak(string words)

        {

            switch (words)

            {

                case "HelloWorld":

                    Console.WriteLine("Person ("+this.GetType()+") speak:"+language.HelloWorld);

                    break;

                case "Sorry":

                    Console.WriteLine("Person (" + this.GetType() + ") speak:" + language.Sorry);

                    break;

                default:

                    Console.WriteLine("Did not find the words!");

                    break;

            }

        }

    }

   public abstract class Language

    {

        protected string helloWorld;

        protected string sorry;

 

        public string HelloWorld

        {

            get { return helloWorld; }

            set { helloWorld = value; }

        }

        public string Sorry

        {

            get { return sorry; }

            set { sorry = value; }

        }

    }

 

英国人、英语类组

    public class Englishman : Person

    {

        public override void CreateLanguage()

        {

            language = new EnglishLanguage();

        }

    }

   public class EnglishLanguage : Language

    {

        public EnglishLanguage()

        {

            helloWorld = "Hello World !";

            sorry = "Sorry !";

        }

    }

中国人、汉语类组

    public class Chinese : Person

    {

        public override void CreateLanguage()

        {

            language = new ChineseLanguage();

        }

    }

    public class ChineseLanguage : Language

    {

        public ChineseLanguage()

        {

            helloWorld = "世界你好!";

            sorry = "对不起!";

        }

    }

运行效果

 


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



1250 次浏览
41次
 捐助