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

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

AbstractFactory模式
 
来源:火龙果软件   作者:俎涛
 
1879 次浏览
46次  
问题 存在多组类,
  • 从每组内部角度看:多个类之间具有关联性,它们会一起创建和使用。
  • 从多组之间角度看:各组类具有类似性。
环境 每组类具有一致的关联关系。
解决方案 1.把多组类中的类似性的类进行抽象,建立稳定基点。

例如:American和Chinese抽象成Person,ChineseLanguage和AmericanLanguage抽象成Language。

2.为一组类的创建提供一个统一的抽象工厂类,分别负责组内各个类的创建,而把多个组中的这样的创建类抽象为统一接口。

例如 China负责创建Chinese和ChineseLanguage,America负责创建American和AmericanLanguage,China和American有进一步抽象为Country

3.首先用抽象的工厂类的指针指向具体的工厂类,然后由具体的工厂类创建相关的多个类,为了保持适应性,所有的创建实例都由该类的抽象类代表。

例如:Country指向具体的America,然后America创建American和AmericanLanguage,这些实例由Person和Language指向。通过Person的指针调用America的行为Speak()。

效果 可以把一组类的创建封装,并通过抽象的指针调用具体类的行为。
实例 由国家创建人和语言

结构类图

模式范例

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

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

用例模型

用例名称 什么人说什么话
用例概述 中国人可以用汉语说话,英国人可以用英语说话。
基本场景 1. 创建国家,
2. 国家创建人和语言,
3. 人说话

设计类图

顺序图:

代码目录

主程序Program.Main()

国家类组

    abstract class Country

    {

        abstract public Person CreatePerson();

 

        abstract public Language CreateLanguage();

    }

    class China:Country

    {

        public override Person CreatePerson()

        {

            Console.WriteLine("正在创建Chinese...");

            return new Chinese();

        }

 

        public override Language CreateLanguage()

        {

            Console.WriteLine("正在创建ChineseLanguage...");

            return new ChineseLanguage();

        }

    }

    class America:Country

    {

        public override Person CreatePerson()

        {

            Console.WriteLine("正在创建American...");

            return new American();

        }

 

        public override Language CreateLanguage()

        {

            Console.WriteLine("正在创建AmericanLanguage...");

            return new AmericanLanguage();

        }

    }

 

语言类组

   abstract class Language

    {

        abstract public string getWords();

    }

    class AmericanLanguage:Language

    {

        public override string getWords()

        {

            return "Hello";

        }

    }

    class ChineseLanguage:Language

    {

        public override string getWords()

        {

            return"你好";

        }

    }

人种类组

abstract class Person

    {

        abstract public void Speak(string words);

    }

class Chinese:Person

    {

        public override void Speak(string words)

        {

            Console.WriteLine("Chinese is speaking words '{0} '  ... ", words);

        }

    }

class American:Person

    {

        public override void Speak(string words)

        {

            Console.WriteLine("American is speaking words '{0} '  ... ",words);

        }

    }

应用程序

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("America建立...");

            Country country = new America();

            //Country country = new China();

 

            Person person =country.CreatePerson();

            Language language = country.CreateLanguage();

            string words = language.getWords();

            person.Speak(words);

 

            Console.ReadLine();

 

        }

    }

运行效果

 


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

1元 10元 50元





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



1879 次浏览
46次
 捐助