首页 > 代码库 > 设计模式二:工厂模式

设计模式二:工厂模式

  这是我们用得比较多的一种设计模式,也是23种标准设计模式之一,使用前面讲的简单工厂设计模式,遇到具体产品经常变换时就不太适合了,违反了开闭设计原则;怎么才能避免修改工厂类呢?工厂方法模式可以做到。
  工厂方法模式要求我们应该有一个抽象的工厂类,我们知道尽量使用抽象类或接口来定义就可以达到一个开闭原则的效果,这样我们在抽象的工厂类定义一个生产产品的方法,这个方法就是工厂方法,这也是工厂方法模式的由来,他具体的行为会有他的子类或实现类来实现。如果想生产某种产品,就定义一个新的产品,新的产品工厂类,这样就实现了不同的产品进行一个不同的创建,这样如果有信的产品,只需要添加新的工厂类,原来写好的代码不会发生变化,这种方式符合开闭原则,可扩展比较好。 

技术分享

添加一个具体产品,只需要在添加一个具体产品的工厂类实现抽象工厂类,不需要修改原来的代码

技术分享 

示例代码:

抽象产品类:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 工厂模式
 8 {
 9     /*
10        动物抽象类
11      * 抽象产品
12      */
13     public abstract class Animal
14     {
15         public abstract void Eat();
16     }
17 }

抽象工厂类:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 工厂模式
 8 {
 9     /*
10       动物抽象工厂类
11      
12      */
13     public abstract class AnimalFactory
14     {
15         public abstract Animal GetAnimal();
16 
17     }
18 }

生产狗的具体工厂类:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 工厂模式
 8 {
 9     /// <summary>
10     /// 具体工厂:生成狗
11     /// </summary>
12    public class DogFactory :AnimalFactory
13     {
14 
15         public override Animal GetAnimal()
16         {
17             return new Dog();
18         }
19     }
20 }

生产企鹅的具体工厂类:

技术分享
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 工厂模式
 8 {
 9     /// <summary>
10     /// 具体工厂:生成企鹅
11     /// </summary>
12     public class PenguinFactory :AnimalFactory
13     {
14         public override Animal GetAnimal()
15         {
16             return new Penguin();
17         }
18     }
19 }
View Code

具体产品狗类:

技术分享
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 工厂模式
 8 {
 9     /*
10        具体的产品类,实现抽象产品类
11      */
12     public class Dog:Animal
13     {
14         // 实现抽象方法
15         public override void Eat()
16         {
17             Console.WriteLine("狗在吃饭!");
18         }
19     }
20 }
View Code

具体产品企鹅类:

技术分享
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 工厂模式
 8 {
 9     /*
10       具体产品类,实现抽象产品类
11      
12      */
13     public class Penguin : Animal
14     {
15         // 实现抽象方法
16         public override void Eat()
17         {
18             Console.WriteLine("企鹅在吃饭!");
19         }
20     }
21 }
View Code

客户端调用:

技术分享
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace 工厂模式
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             AnimalEat(new  DogFactory());
14             Console.ReadKey();
15         }
16 
17         static void AnimalEat(AnimalFactory af)
18         {
19             Animal am = af.GetAnimal();
20             am.Eat();
21         }
22     }
23 }
View Code

类图:

技术分享

如果想在增加一个Cat类,只需要增加一个具体的Cat类实现Animal类的方法,增加一个具体的Cat工厂类实现抽象工厂类即可,不需要在修改已经写好的代码,符合开闭原则。

设计模式二:工厂模式