23种设计模式之抽象工厂

抽象工厂

当想创建一组密不可分的对象时,工厂方法似乎就不够用了

抽象工厂是应对产品族概念的。应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。比如,每个汽车公司可能要同时生产轿车、货车、客车,那么每一个工厂都要有创建轿车、货车和客车的方法

优点:向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象

缺点:增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性

 1     public interface IRace
 2     {
 3         /// <summary>
 4         /// show出王者
 5         /// </summary>
 6         void ShowKing();
 7     }
 8     public interface IArmy
 9     {
10         void ShowArmy();
11     }
12     public interface IHero
13     {
14         void ShowHero();
15     }
16     public interface ILuck
17     {
18         void ShowLuck();
19     }
20     public interface IResource
21     {
22         void ShowResource();
23     }

 1     /// <summary>
 2     /// War3种族之一
 3     /// </summary>
 4     public class Human : IRace
 5     {
 6         public Human(int id, DateTime dateTime, string reamrk)
 7         { }
 8         public Human()
 9         { }
10
11         public void ShowKing()
12         {
13             Console.WriteLine("The King of {0} is {1}", this.GetType().Name, "Sky");
14         }
15     }
16
17     public class HumanArmy : IArmy
18     {
19
20         public void ShowArmy()
21         {
22             Console.WriteLine("The Army of {0} is {1}", this.GetType().Name, "footman,火枪,骑士,狮鹫");
23         }
24     }
25
26     public class HumanHero : IHero
27     {
28         public void ShowHero()
29         {
30             Console.WriteLine("The Army of {0} is {1}", this.GetType().Name, "大法师、山丘、圣骑士、血法师");
31         }
32     }
33     public class HumanResource : IResource
34     {
35
36         public void ShowResource()
37         {
38             Console.WriteLine("The Army of {0} is {1}", this.GetType().Name, "1000G1000W");
39         }
40     }

 1     /// <summary>
 2     /// War3种族之一
 3     /// </summary>
 4     public class ORC : IRace
 5     {
 6         public void ShowKing()
 7         {
 8             Console.WriteLine("The King of {0} is {1}", this.GetType().Name, "Grubby");
 9         }
10     }
11
12     public class ORCArmy : IArmy
13     {
14
15         public void ShowArmy()
16         {
17             Console.WriteLine("The Army of {0} is {1}", this.GetType().Name, "大G、风骑士、蝙蝠、战车、牛头人");
18         }
19     }
20
21     public class ORCHero : IHero
22     {
23         public void ShowHero()
24         {
25             Console.WriteLine("The Army of {0} is {1}", this.GetType().Name, "剑圣、小萨满、先知、牛头人酋长");
26         }
27     }
28     public class ORCResource : IResource
29     {
30
31         public void ShowResource()
32         {
33             Console.WriteLine("The Army of {0} is {1}", this.GetType().Name, "1000G1000W");
34         }
35     }

 1     /// <summary>
 2     /// War3种族之一
 3     /// </summary>
 4     public class Undead : IRace
 5     {
 6         public void ShowKing()
 7         {
 8             Console.WriteLine("The King of {0} is {1}", this.GetType().Name, "GoStop");
 9         }
10     }
11
12     public class UndeadArmy : IArmy
13     {
14
15         public void ShowArmy()
16         {
17             Console.WriteLine("The Army of {0} is {1}", this.GetType().Name, "食尸鬼,蜘蛛,雕像,战车,憎恶,冰霜巨龙");
18         }
19     }
20
21     public class UndeadHero : IHero
22     {
23         public void ShowHero()
24         {
25             Console.WriteLine("The Army of {0} is {1}", this.GetType().Name, "DK、Lich、小强、恐惧魔王");
26         }
27     }
28     public class UndeadResource : IResource
29     {
30
31         public void ShowResource()
32         {
33             Console.WriteLine("The Army of {0} is {1}", this.GetType().Name, "1000G1000W");
34         }
35     }

 1     /// <summary>
 2     /// 一个工厂负责一些产品的创建
 3     /// 产品簇
 4     /// 单一职责就是创建完整的产品簇
 5     ///
 6     /// 继承抽象类后,必须显式的override父类的抽象方法
 7     /// </summary>
 8     public abstract class FactoryAbstract
 9     {
10         public abstract IRace CreateRace();
11         public abstract IArmy CreateArmy();
12         public abstract IHero CreateHero();
13         public abstract IResource CreateResource();
14
15         //public abstract ILuck CreateLuck();
16     }

 1     /// <summary>
 2     /// 一个工厂负责一些产品的创建
 3     /// </summary>
 4     public class HumanFactory : FactoryAbstract
 5     {
 6         public override IRace CreateRace()
 7         {
 8             return new Human();
 9         }
10
11         public override IArmy CreateArmy()
12         {
13             return new HumanArmy();
14         }
15         public override IHero CreateHero()
16         {
17             return new HumanHero();
18         }
19         public override IResource CreateResource()
20         {
21             return new HumanResource();
22         }
23     }

 1     /// <summary>
 2     /// 一个工厂负责一些产品的创建
 3     /// </summary>
 4     public class ORCFactory : FactoryAbstract
 5     {
 6         public override IRace CreateRace()
 7         {
 8             return new ORC();
 9         }
10
11         public override IArmy CreateArmy()
12         {
13             return new ORCArmy();
14         }
15         public override IHero CreateHero()
16         {
17             return new ORCHero();
18         }
19         public override IResource CreateResource()
20         {
21             return new ORCResource();
22         }
23     }

 1     /// <summary>
 2     /// 一个工厂负责一些产品的创建
 3     /// </summary>
 4     public class UndeadFactory : FactoryAbstract
 5     {
 6         public override IRace CreateRace()
 7         {
 8             return new Undead();
 9         }
10
11         public override IArmy CreateArmy()
12         {
13             return new UndeadArmy();
14         }
15         public override IHero CreateHero()
16         {
17             return new UndeadHero();
18         }
19         public override IResource CreateResource()
20         {
21             return new UndeadResource();
22         }
23     }

前端调用

 1                {
 2                     IRace race = new Undead();
 3                     IArmy army = new UndeadArmy();
 4                     IHero hero = new UndeadHero();
 5                     IResource resource = new UndeadResource();
 6                     //1 对象转移,屏蔽细节,让使用者更轻松
 7                     //2 对象簇的工厂
 8                 }
 9                 {
10
11                     //System.Data.SqlClient.SqlClientFactory
12                     FactoryAbstract undeadFactory = new UndeadFactory();
13                     IRace race = undeadFactory.CreateRace();// new Undead();
14                     IArmy army = undeadFactory.CreateArmy();//new UndeadArmy();
15                     IHero hero = undeadFactory.CreateHero();//new UndeadHero();
16                     IResource resource = undeadFactory.CreateResource();//new UndeadResource();
17                 }
18                 {
19                     FactoryAbstract humanFactory = new HumanFactory();
20                     IRace race = humanFactory.CreateRace();
21                     IArmy army = humanFactory.CreateArmy();
22                     IHero hero = humanFactory.CreateHero();
23                     IResource resource = humanFactory.CreateResource();
24                 }

抽象工厂:创建对象,创建一组密不可分的对象
 创建产品簇,多个对象是个整体,不可分割

工厂+约束
工厂

倾斜的可扩展性设计
扩展种族很方便
增加产品很麻烦

工厂方法与抽象工厂

1、工厂方法

一个抽象产品类,可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例

2、抽象工厂

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例

3、工厂方法与抽象工厂的区别

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个
本文参考文档:https://blog.csdn.net/liuziteng0228/article/details/54849055

原文地址:https://www.cnblogs.com/Dewumu/p/11431053.html

时间: 2024-11-09 01:04:27

23种设计模式之抽象工厂的相关文章

【Unity与23种设计模式】抽象工厂模式(Abstract Factory)

GoF中定义: "提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类." 意思就是 根据不同的执行环境产生不同的抽象类子类 抽象工厂模式经常在面试中会涉及到 下面的例子为工厂1和工厂2 两个工厂都可以生成产品A和B 但是两个工厂工艺不同 所以工厂1只能生产产品A1和B1 工厂2只能生产产品A2和B2 //可生成各抽象成品对象的操作 public abstract class AbstractFactory{ public abstract AbstractProductA

23种设计模式之抽象工厂模式

抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. package designMode.abstractFactory; class User { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() {

重头开始学23种设计模式:三大工厂(简单工厂,工厂方法,抽象工厂)

在开发当中我们经常会使用三个设计模式,来帮我们解决项目代码的可扩展性. 在简单工厂,工厂方法,抽象工厂这三个设计模式当中,代码其实都很简单,主要是要理解运用. 简单工厂: 简单工厂说白了,就是利用Switch根据传递的参数,进行实例化. 工厂方法: 工厂方法,为解决每次都去增加Swicth的简单工厂的升级.为每一个产品提供一个工厂类. 抽象工厂: 抽象工厂,我觉得也是对工厂方法的再次升级,工厂方法每次只能创作一个产品,而抽象工厂就是产品线的产品族. 总结下,从网上找到一个大牛的回复: 我认为不能

23种设计模式(2)-简单工厂模式

这些设计模式都是在这么多年的软件开发中,先辈对软件重构的经验总结提炼的结果,这些设计模式要遵循软件设计的六原则.每一种设计模式都有相应的需求场景的.有了这些设计模式的思想和面向对象的思想,在软件设计特定的需求中会给你解决思路. 一,需求场景 在此,我也借用书上看到的一个例子.计算器工厂给我们留了一些任务,设计一个计算器做成成品卖给买家.但是这个任务是分两个阶段让我们实现的.如下: 阶段一:买家目前只需要计算器具有加减程序的功能即可.别的功能待市场需求再做设计.也就是阶段二的任务. 阶段二:阶段一

23种设计模式[2]:工厂方法模式

一.简单工厂模式(静态工厂方法,不属于23种GOF设计模式之一) 定义:定义一个用于创建产品对象的方法,由该工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 类型:创建类模式 public interface SmsService { void sendSms(); } public class MontnetsService implements SmsService { @Override public void sendSms() { Syste

二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Message有一个Insert()方法,该方法的参数是MessageModel. AbstractMessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Abstract

23种设计模式之简单工厂

简单工厂模式描述的是,通过类的继承关系,父类(工厂类)与子类(产品类),调用父类中的方法,实际干活儿的是子类中的方法:封装需求的不确定性,做出通用的编程,下面以常用的计算器为例: 最容易想到的写法是: 1 Console.WriteLine("请输入操作数1:"); 2 double a = double.Parse(Console.ReadLine()); 3 Console.WriteLine("请输入操作符:"); 4 string opt = Console

23种设计模式之简单工厂模式

模式是基于在面对对象的思想上实现的计算机编程模式思维面对对象的模式思维有四大好处:可维护,可复用,可拓展,灵活性好基于三个步骤,封装,继承,多态举个例子:计算机要完成两个数字之间的运算一.就要考虑到定义一个可被继承类1.需要两个数的字段并且将之属性化2. 一个virtual的虚方法在每一个运算方法中都可以实现调用 二.要将运算的方法类继承,完成运算方法 三.创建工厂类,将根据运算符号来判断使用哪种运算类 四.在客户端中使用多态调用工厂类,输出结果就OK了 具体代码如下: 原文地址:https:/

23种设计模式(3):抽象工厂模式

定义:为创建一组相关或相互依赖的对象提供一个接口,并且无需指定他们的详细类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的差别 抽象工厂模式是工厂方法模式的升级版本号,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的差别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的全部产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类