.Net简单工厂模式,工厂模式,抽象工厂模式实例

1.定义

   简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

  工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。

  抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

2.实例

  用工人种蔬菜的例子来说明,蔬菜植物的产品器官有根、茎、叶、花、果等5类,因此按产品器官分类也分成5种,分别是根菜类,茎菜类,叶莱类,花菜类以及果菜类。我们以根菜类,茎菜类为例,分别用简单工厂模式工厂模式抽象工厂模式来实现。先说明一下:根菜类的

  植物有:大豆,胡萝卜,大头菜等;茎菜类的植物有:竹笋,莲藕,马铃薯等。下面便是三种模式下种菜的实现过程。

3.实现过程

  A.简单工厂模式

    1).在根菜类植物中,工人种植大豆,胡萝卜,大头菜,代码如下: 

 1 namespace 简单工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 根菜类
 5    /// </summary>
 6     public class RootVegetable
 7     {
 8         public void PlantVegetable()
 9         {
10             Console.WriteLine("亲!我在种植大豆,胡萝卜,还有大头菜哦!");
11         }
12     }
13 }

    在茎菜类植物中,工人种植竹笋,莲藕,马铃薯,代码如下: 

 1 namespace 简单工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 茎菜类
 5     /// </summary>
 6     public class StemVegetable
 7     {
 8         public void PlantVegetable()
 9         {
10             Console.WriteLine("亲啊!我在种植竹笋,莲藕,还有马铃薯哦!");
11         }
12     }
13 }

    2)进一步抽象,为它们抽象出共同的父类,蔬菜接口,如图:

    

      

      

      抽象后的代码如下:    

 1 namespace 简单工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 蔬菜接口
 5     /// </summary>
 6     public abstract class Vegetable
 7     {
 8         public abstract void PlantVegetable();
 9     }
10 }

 1 namespace 简单工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 根菜类
 5     /// </summary>
 6     public class RootVegetable:Vegetable
 7     {
 8         public override void PlantVegetable()
 9         {
10             Console.WriteLine("亲!我在种植大豆,胡萝卜,还有大头菜哦!");
11         }
12     }
13 }

 1 namespace 简单工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 茎菜类
 5     /// </summary>
 6     public class StemVegetable:Vegetable
 7     {
 8         public override void PlantVegetable()
 9         {
10             Console.WriteLine("亲啊!我在种植竹笋,莲藕,还有马铃薯哦!");
11         }
12     }
13 }

    3).此时如果工人再种植叶莱类植物的话,只需要增加一个继承父类Vegetable的子类来实现,这样的设计满足了类之间的层次关系,每一个类都只负责一件具体的事情。在应用程序中,当工人种植根菜类植物时,代码如下:

namespace 简单工厂模式_RootVegetableAndStemVegetable
{
    public class Program
    {
        public static void Main(string[] args)
        {
            ///获得茎菜类蔬菜
            Vegetable vge = new RootVegetable();
            vge.PlantVegetable();
            Console.ReadLine();
        }
    }
}

    如果工人由种植根菜类植物变成种植茎菜类植物或者叶菜类植物,那么在应用程序中,诸多代码就要改变,工作量就会增加,此时就需要解耦具体的种植哪类植物和应用程序。这就要引入简单工厂模式了,代码如下:

 1 namespace 简单工厂模式_RootVegetableAndStemVegetable
 2 {
 3     public class VegetableFactory
 4     {
 5         public static Vegetable GetVegetableInstance(string vegetable)
 6         {
 7             Vegetable vge = null;
 8             if (vegetable.Equals("根菜类蔬菜"))
 9             {
10                 return new RootVegetable();
11             }
12             else if (vegetable.Equals("茎菜类蔬菜"))
13             {
14                 return new StemVegetable();
15             }
16
17             return vge;
18         }
19     }
20 }

    此时应用程序代码如下:

 1 namespace 简单工厂模式_RootVegetableAndStemVegetable
 2 {
 3     public class Program
 4     {
 5         public static void Main(string[] args)
 6         {
 7             ///获得茎菜类蔬菜
 8             Vegetable vge1 = (Vegetable)VegetableFactory.GetVegetableInstance("茎菜类蔬菜");
 9             vge1.PlantVegetable();
10             ///获得根菜类蔬菜
11             Vegetable vge2 = (Vegetable)VegetableFactory.GetVegetableInstance("根菜类蔬菜");
12             vge2.PlantVegetable();
13             Console.ReadLine();
14         }
15     }
16 }

    VegetableFactory解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,工人只需根据蔬菜的类型,便可进行种植对应的蔬菜。总之,简单工厂模式实现了对责任的分割。

    4).该简单工厂模式UML图:

    

    5).缺点:工厂类集中了所有产品创建逻辑,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂,并且,它所能创建的类只能是事先考虑到的。对系统的维护和扩展相当不利。

      下面就需要工厂模式来解决了。

  B.工厂模式

    1).由于简单工厂模式系统难以扩展,一旦添加新的蔬菜类型就不得不修改VegetableFactory中的方法,这样就会造成简单工厂的实现逻辑过于复杂,然而工厂模式可以解决简单工厂模式中存在的这个问题。

      在 A.简单工厂模式 的 3) 小点中(前面的都相同),如果工人由种植根菜类植物变成种植茎菜类植物或者叶菜类植物,那么在应用程序中,诸多代码就要改变,工作量就会增加,此时就需要解耦具体的种植哪类植物和应用程序。

      如果此时引入工厂模式,由于每一种类型的蔬菜就是工厂种植的产品,有两种类型的蔬菜,就需要两个工厂去种植,代码如下:

 1 namespace 工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 根菜类
 5     /// </summary>
 6     public class RootVegetableFactory
 7     {
 8         public Vegetable GetVegetableInstance()
 9         {
10             return new RootVegetable();
11         }
12     }
13 }

 1 namespace 工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 茎菜类
 5     /// </summary>
       public Vegetable GetVegetableInstance()       {          return new StemVegetable();       }
13 }

    2).这两个工厂是平级的,在此基础上抽象出一个公共的接口,如图:

      代码如下:

1 namespace 工厂模式_RootVegetableAndStemVegetable
2 {
3     public abstract class VegetableFactory
4     {
5         public abstract Vegetable GetVegetableInstance();
6     }
7 }

 1 namespace 工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 根菜类
 5     /// </summary>
 6     public class RootVegetableFactory:VegetableFactory
 7     {
 8         public override Vegetable GetVegetableInstance()
 9         {
10             return new RootVegetable();
11         }
12     }
13 }

namespace 工厂模式_RootVegetableAndStemVegetable
{
    /// <summary>
    /// 茎菜类
    /// </summary>
    public class StemVegetableFactory:VegetableFactory
    {
        public override Vegetable GetVegetableInstance()
        {
            return new StemVegetable();
        }
    }
}

    

    3).工厂模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品。

        如果此时在种植叶菜类蔬菜,只需增加叶菜类蔬菜工厂和叶菜类蔬菜类。而不用像简单工厂模式中那样去修改工厂类中的实现。应用程序代码如下:

 1 namespace 工厂模式_RootVegetableAndStemVegetable
 2 {
 3     public class Program
 4     {
 5         public static void Main(string[] args)
 6         {
 7             // 初始化工厂
 8             VegetableFactory Factory = new RootVegetableFactory();
 9             //种植根菜类蔬菜
10             Vegetable vge = Factory.GetVegetableInstance();
11             vge.PlantVegetable();
12             Console.ReadLine();
13         }
14     }
15 }

    此时如果想种植茎菜类蔬菜,只需更改

VegetableFactory Factory = new StemVegetableFactory();

    其余地方不需修改。如果利用.NET中的反射机制来进一步修改我们的程序,这时就要用到配置文件了,这样可以避免上述的修改。配置文件如下:

1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3     <startup>
4         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
5     </startup>
6   <appSettings>
7     <add key="factoryName" value="工厂模式_RootVegetableAndStemVegetable.RootVegetableFactory"/>
8   </appSettings>
9 </configuration>

    应用程序如下:

namespace 工厂模式_RootVegetableAndStemVegetable
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string factoryName = ConfigurationManager.AppSettings["factoryName"];
            VegetableFactory vf =(VegetableFactory) Assembly.Load("工厂模式_RootVegetableAndStemVegetable").CreateInstance(factoryName);
            Vegetable vge = vf.GetVegetableInstance();
            vge.PlantVegetable();
            Console.ReadLine();
        }
    }
}

    注意:1.Assembly.Load("XXX")的使用说明如下:XXX并不是命名空间,而是程序集名称,也就是dll的名称,,可以在bin目录下看一下,而不是类名!

        即:Assembly.Load("程序集").CreateInstance("命名空间.类")

      2.注意CreateInstance()一定是 命名空间.类名,否则创建的实例为空.

    4)该工厂模式UML图

    5)缺点:在工厂模式中,一个工厂只能创建一种产品,如果要求工厂创建多种产品,工厂模式就不好用了。下面就需要 抽象工厂模式 来解决了。

  C.抽象工厂模式

    1).随着科技的发展,工人逐步要种植转基因与非转基因食品了,在以前的蔬菜种类上又增加了一个层次,这个时候无法将其作为一个层次来解决,所以必须采用抽象工厂的方式来解决。依然以种植根菜类蔬菜和茎菜类蔬菜为例。

      此时在蔬菜下有根菜类蔬菜类型 和 茎菜类蔬菜类型,在根菜类蔬菜类型下 有转基因根菜类蔬菜 和 非转基因食品根菜类蔬菜,在茎菜类蔬菜类型下有 转基因茎菜类蔬菜 和 非转基因茎菜类蔬菜 。如图:

      代码如下:

namespace  抽象工厂模式_RootVegetableAndStemVegetable{
    /// <summary>
    /// 蔬菜接口
    /// </summary>
    interface Vegetable
    {
    }
}

 1 namespace  抽象工厂模式_RootVegetableAndStemVegetable 2 {
 3     /// <summary>
 4     /// 根菜
 5     /// </summary>
 6     public abstract class RootVegetable:Vegetable
 7     {
 8         public abstract void PlantRootVegetable();
 9     }
10 }

 1 namespace  抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 茎菜
 5     /// </summary>
 6     public abstract class StemVegetable:Vegetable
 7     {
 8         public abstract void PlantStemVegetable();
 9     }
10 }

 1 namespace 抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 转基因根菜
 5     /// </summary>
 6     public class GMFRootVegetable:RootVegetable
 7     {
 8         public override void PlantRootVegetable()
 9         {
10             Console.WriteLine("亲!我在种植转基因类型的大豆,胡萝卜,还有大头菜哦!");
11         }
12     }
13 }

 1 namespace 抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 非转基因根菜
 5     /// </summary>
 6     public class NonGMFRootVegetable:RootVegetable
 7     {
 8         public override void PlantRootVegetable()
 9         {
10             Console.WriteLine("亲!我在种植非转基因类型的大豆,胡萝卜,还有大头菜哦!");
11         }
12     }
13 }

 1 namespace 抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 转基因茎菜
 5     /// </summary>
 6     public class GMFStemVegetable:StemVegetable
 7     {
 8         public override void PlantStemVegetable()
 9         {
10             Console.WriteLine("亲啊!我在种植转基因类型的芹菜,莲藕,还有马铃薯哦!");
11         }
12     }
13 }

 1 namespace 抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 非转基因茎菜
 5     /// </summary>
 6     public class NonGMFStemVegetable:StemVegetable
 7     {
 8         public override void PlantStemVegetable()
 9         {
10             Console.WriteLine("亲啊!我在种植非转基因类型的芹菜,莲藕,还有马铃薯哦!");
11         }
12     }
13 }

    2).由于现在种植转基因与非转基因蔬菜,可以创建 转基因蔬菜工厂 与 非转基因蔬菜工厂,在 转基因蔬菜工厂 下可以种植 转基因根菜类蔬菜 和 转基因茎菜类蔬菜,在 非转基因蔬菜工厂 下可以种植 非转基因根菜类蔬菜 和 非转基因茎菜类蔬菜。

        如果现在工人只要求是种植转基因蔬菜,代码如下:

 1 namespace 抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 转基因工厂
 5     /// </summary>
 6     public class VegetableFactory    {
 7         /// <summary>
 8         /// 转基因根菜
 9         /// </summary>
10         /// <returns></returns>
11         public  RootVegetable GetRootVegetableInstance()
12         {
13             return new GMFRootVegetable();
14         }
15         /// <summary>
16         /// 转基因茎菜
17         /// </summary>
18         /// <returns></returns>
19         public StemVegetable GetStemVegetableInstance()
20         {
21             return new GMFStemVegetable();
22         }
23     }
24 }

      可以很好地解决种植转基因蔬菜的问题,但一段时间后,工人又要种植非转基因蔬菜蔬菜,此时就要修改系统源代码,修改VegetableFactory这个类,代码如下:

 1 namespace 抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 非转基因工厂
 5     /// </summary>
 6     public class VegetableFactory:
 7     {
 8         /// <summary>
 9         /// 非转基因根菜
10         /// </summary>
11         /// <returns></returns>
12         public  RootVegetable GetRootVegetableInstance()
13         {
14             return new NonGMFRootVegetable();
15         }
16         /// <summary>
17         /// 非转基因茎菜
18         /// </summary>
19         /// <returns></returns>
20         public StemVegetable GetStemVegetableInstance()
21         {
22             return new NonGMFStemVegetable();
23         }
24     }
25 }

      最终的工作都是对VegetableFactory这个类进行修改。工作量依然没有减少。此时引入 抽象工厂模式,并在 抽象工厂模式 加一个静态方法,便可解决这个问题。如图:

      代码如下:

 1 namespace 抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 抽象工厂
 5     /// </summary>
 6     public abstract class AbstractFactory
 7     {
 8         /// <summary>
 9         /// 获得根菜类蔬菜
10         /// </summary>
11         public abstract RootVegetable GetRootVegetableInstance();
12         /// <summary>
13         /// 获得茎菜类蔬菜
14         /// </summary>
15         public abstract StemVegetable GetStemVegetableInstance();
16         /// <summary>
17         /// 获得转基因工厂还是非转基因工厂
18         /// </summary>
19         public static AbstractFactory GetAbstractFactoryInstance(string factoryName)
20         {
21             AbstractFactory instance = null;
22             if (factoryName.Equals("转基因工厂"))
23             {
24                 instance= new GMFVegetableFactory();
25             }
26             else if (factoryName.Equals("非转基因工厂"))
27             {
28                 instance = new NonGMFVegetableFactory();
29             }
30
31             return instance;
32         }
33     }
34 }

 1 namespace 抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 转基因工厂
 5     /// </summary>
 6     public class GMFVegetableFactory:AbstractFactory
 7     {
 8         /// <summary>
 9         /// 转基因根菜
10         /// </summary>
11         /// <returns></returns>
12         public override RootVegetable GetRootVegetableInstance()
13         {
14             return new GMFRootVegetable();
15         }
16         /// <summary>
17         /// 转基因茎菜
18         /// </summary>
19         /// <returns></returns>
20         public override StemVegetable GetStemVegetableInstance()
21         {
22             return new GMFStemVegetable();
23         }
24     }
25 }

 1 namespace 抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 非转基因工厂
 5     /// </summary>
 6     public class NonGMFVegetableFactory:AbstractFactory
 7     {
 8         /// <summary>
 9         /// 非转基因根菜
10         /// </summary>
11         /// <returns></returns>
12         public override RootVegetable GetRootVegetableInstance()
13         {
14             return new NonGMFRootVegetable();
15         }
16         /// <summary>
17         /// 非转基因茎菜
18         /// </summary>
19         /// <returns></returns>
20         public override StemVegetable GetStemVegetableInstance()
21         {
22             return new NonGMFStemVegetable();
23         }
24     }
25 }

    应用程序代码:

 1 namespace 抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     public class Program
 4     {
 5         public static void Main(string[] args)
 6         {
 7             AbstractFactory af = AbstractFactory.GetAbstractFactoryInstance("转基因工厂");
 8             ///种植转基因类型蔬菜
 9             RootVegetable rootVge = af.GetRootVegetableInstance();
10             rootVge.PlantRootVegetable();
11             Console.ReadLine();
12         }
13     }
14 }

    如果想种植 非转基因根菜类蔬菜,只需修改:

1 AbstractFactory af = AbstractFactory.GetAbstractFactoryInstance("非转基因工厂");

    不用再担心到底是种植转基因还是非转基因蔬菜,修改的地方非常少。

    3).但也有一个小问题,如果有一天,科技已经发展到一定程度,种植需要很长时间,工人直接·采用3D打印技术,打印各种类型的蔬菜,这是在原有的层次上又增加了一个层次,增加一个

    3D打印蔬菜工厂到不是难事,但要修改AbstractFactory这个类,在GetAbstractFactoryInstance(string factoryName)方法中添加一个if(){}判断语句,依然要修改源代码。可以利用

    .NET中的反射机制来进一步修改我们的程序,这时就要用到配置文件了,这样可以避免上述的修改。配置文件如下:

1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3     <startup>
4         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
5     </startup>
6   <appSettings>
7     <add key="factoryName" value="抽象工厂模式_RootVegetableAndStemVegetable.GMFVegetableFactory"/>
8   </appSettings>
9 </configuration>

  此时AbstractFactory类修改如下:

 1 namespace 抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     /// <summary>
 4     /// 抽象工厂
 5     /// </summary>
 6     public abstract class AbstractFactory
 7     {
 8         /// <summary>
 9         /// 获得根菜类蔬菜
10         /// </summary>
11         public abstract RootVegetable GetRootVegetableInstance();
12         /// <summary>
13         /// 获得茎菜类蔬菜
14         /// </summary>
15         public abstract StemVegetable GetStemVegetableInstance();
16         /// <summary>
17         /// 获得转基因工厂还是非转基因工厂
18         /// </summary>
19         public static AbstractFactory GetAbstractFactoryInstance()
20         {
21             string factoryName = ConfigurationSettings.AppSettings["factoryName"];
22             AbstractFactory instance = null;
23             if (!factoryName.Equals(string.Empty))
24             {
25                 instance = (AbstractFactory)Assembly.Load("抽象工厂模式_RootVegetableAndStemVegetable").CreateInstance(factoryName);
26             }
27             return instance;
28         }
29     }
30 }

    应用程序如下:

 1 namespace 抽象工厂模式_RootVegetableAndStemVegetable
 2 {
 3     public class Program
 4     {
 5         public static void Main(string[] args)
 6         {
 7             AbstractFactory af = AbstractFactory.GetAbstractFactoryInstance();
 8             ///种植转基因类型蔬菜
 9             RootVegetable rootVge = af.GetRootVegetableInstance();
10             rootVge.PlantRootVegetable();
11             Console.ReadLine();
12         }
13     }
14 }

    当再增加一个层次时,就不必修改AbstractFactory这个类,只需修改配置文件即可。

  4).缺点: 难以支持新种类的产品。难以扩展抽象工厂以生产新种类的产品。这是因为抽象工厂接口确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变,这样也就违背了“开发——封闭”原则。

5).该抽象工厂模式的UML图

4.工厂模式VS抽象工厂模式(转载)

  1.区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

   再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。

  2.工厂方法模式与抽象工厂模式对比:

                                            工厂方法模式                                                                                     抽象工厂模式
 
                                              针对的是一个产品等级结构                                                              针对的是面向多个产品等级结构
                                               一个抽象产品类                                                                            多个抽象产品类
                                              可以派生出多个具体产品类                                                               每个抽象产品类可以派生出多个具体产品类
                                              一个抽象工厂类,可以派生出多个具体工厂类                                        一个抽象工厂类,可以派生出多个具体工厂类
                                              每个具体工厂类只能创建一个具体产品类的实例                                     每个具体工厂类可以创建多个具体产品类的实例

原文地址:https://www.cnblogs.com/weihengblogs/p/9229213.html

时间: 2024-10-15 12:34:41

.Net简单工厂模式,工厂模式,抽象工厂模式实例的相关文章

设计模式之创建型模式—— 1.3 抽象工厂模式

<?php /**  * 1.3 抽象工厂模式  * 解决的问题:  *  如何解决多个类实例化对象的问题.  * 解决的方案:  *  提供一个创建一系列相关或相互依赖对象的  *    接口,而无需指定它们具体的类.  * 该模式包含四种角色:  *  1. 抽象产品角色(两个或多个)  *  职责:同工厂方法模式  *    2. 具体产品角色  *    职责:同工厂方法模式  *      3. 抽象工厂角色  *    职责:同工厂方法模式  *      4. 具体工厂角色  * 

工厂模式三部曲:抽象工厂模式

工厂模式三部曲:简单工厂模式 工厂模式三部曲:工厂方法模式 前言 这是工厂模式三部曲中的最后一篇了,在这篇文章中将会讲述抽象工厂模式,抽象工厂模式正如其名字一样,非常抽象.但是抽象工厂模式的功能却十分强大,对抽象工厂的利用也非常好. 这篇文章中会像本系列第一篇一样,给出普通实现方式和使用了反射机制的实现两种代码,并且会说明这两种实现方式的区别.并且在文章的最后,会将这三种模式放在一起,对这三种工厂模式进行总结. 本人理解可能不够深刻,这一系列文章中存在的问题,欢迎大家提出,谢谢! 什么是抽象工厂

浅析设计模式(六)——创建型模式之Abstract-Factory(抽象工厂模式)

抽象工厂模式Abstract-Factory 本文的套路: 抽象工厂模式的定义 抽象工厂模式的参与者及其角色 抽象工厂模式的类图 抽象工厂模式的示例 参考 抽象工厂模式的定义 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类. 前面[浅析设计模式(四)--创建型模式之Simple-Factory(简单工厂方法,非设计模式)]中介绍的简单工厂方法,虽然已经对变化的部分进行了封装,但是这里只由一个对象负责所有的具体类的实例化,因此每次有新增对象类型时,都需要改变工厂的源码进行扩展.

简单理解C#中的抽象工厂模式是什么概念!

抽象工厂模式向客户端提供一个接口,使得客户端在不必指定具体类型的情况下,创建多个产品族中的对象.本文采取的仍然是接着以前的那个快餐店的例子.现在,快餐店经常良好,逐渐发展壮大,为了适合不同地方人的饮食习惯,创建了两大系列(相当于产品族)快餐,北方系列和南方系列.每个系列分别由一个大厨掌勺.抽象工厂模式对新的产品族支持开闭原则,但对新的产品不支持开闭原则.例如增加新的产品族,如增加美国系列快餐(相当于增加了一个产品族),则只要从每个产品接口继承一个相应美国系列产品即可,不需要更改已有的代码.但如果

《JAVA与模式》之抽象工厂模式

场景问题 举个生活中常见的例子--组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择CPU的时候,面临一系列的问题,比如品牌.型号.针脚数目.主频等问题,只有把这些问题都确定下来,才能确定具体的CPU. 同样,在选择主板的时候,也有一系列问题,比如品牌.芯片组.集成芯片.总线频率等问题,也只有这些都确定了,才能确定具体的主板. 选择不同的CPU和主板,是每个客户在组装电脑的时候,向

(创建型模式三)抽象工厂模式

package com.eyugame.modle; /** * 抽象工厂模式 * * @author JYC506 * */ public class MyFactory implements IAbstractFactory { @Override public IProduct1 createIProduct1() { return new Product1(); } @Override public IProduct2 createIProduct2() { return new Pro

工厂模式三部曲之抽象工厂模式

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码.因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解. 举例如下:(我们举一个发送邮件和短信的例子) public interface Sender { public void Send(); } 两个实现类:

设计者模式详解--抽象工厂模式

1. 概述 抽象工厂模式为一个产品家族提供了统一的创建接口.当需要这个产品家族的某一系列的时候,可以从抽象工厂中选出相对应的系列来创建一个具体的工厂类别. 2. 抽象工厂模式中的角色 2.1 抽象工厂(AbstractFactory):担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的. 2.2 具体工厂(ConcreteFactory):这个角色直接在客户端的调用下创建产品的实例.这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的. 2.3 抽象产品

抽象模式之【抽象工厂模式】

原则:依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体: 一.创建接口:发送消息 package Factory; public interface Sender{ public void Send(); } 二.创建两个实现类 1.发送邮箱 package Factory; public class MailSend implements Sender{ @Override public void Send() { System.out.println("mailsend");

PHP简单工厂模式、工厂方法模式和抽象工厂模式比较

PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动更改. 根据抽象程度不同,PHP工厂模式分为:简单工厂模式.工厂方法模式和抽象工厂模式 简单工厂模式: /******代码在原文还是git上都有osgit地址 https://git.oschina.net/mjw/pattern.git  *******/ /** *简单工厂模式与工厂方法模式比较