推荐阅读:
在工厂模式中,一个工厂只能创建一种产品,但我们往往希望,一个工厂能创建一系列产品。很明显工厂模式已经不能满足我们的需求,于是出现了抽象工厂模式。
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂模式:
1.首先是不同产品类的抽象;
2.其次是不同工厂类的抽象;
3.最后是产品不同系列的抽象;
抽象工厂模式要素:
1、抽象工厂(Creator):是工厂方法模式的核心角色,任何在模式中创建的对象的工厂类必须实现这个接口;
2、具体工厂(Concrete Creator):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象;
3、抽象产品(Product):工厂方法模式所创建的对象的基类,也就是产品对象的共同父类或共同拥有的接口;
4、具体产品(Concrete Product):这个角色实现了抽象产品角色所定义的接口。
下面举个例子来介绍一下上面几个要素之间的关系吧。
例如:命名空间抽象工厂方法模式中包含抽象工厂Factory;具体工厂MNFactory ,YLFactory;抽象产品Milk,Yogurt;具体产品YLMilk,MNMilk,YLYogurt,MNYogurt 。本案例将向大家展示如何使用简单工厂模式来进行不同的算术运算。
代码实现过程:
1.创建抽象产品:
interface Milk//所有牛奶的父类
{
void DisPlay();//显示牛奶品牌
}
interface Yogurt//所有酸奶的父类
{
void Display();//显示酸奶品牌
}
- 所有的具体产品的代码(伊利牛奶,蒙牛牛奶;伊利酸奶,蒙牛酸奶)
class YLMilk:Milk//伊利牛奶
{
public void DisPlay()
{
Console.WriteLine("我是伊利牛奶!");
}
}
class MNMilk:Milk//蒙牛牛奶
{
public void DisPlay()
{
Console.WriteLine("我是蒙牛牛奶!");
}
}
class YLYogurt:Yogurt//伊利酸奶
{
public void Display()
{
Console.WriteLine("我是伊利酸奶!");
}
}
class MNMilk:Yogurt//蒙牛酸奶
{
public void Display()
{
Console.WriteLine("我是蒙牛酸奶!");
}
}
3.抽象工厂
interface Factory//所有工厂的父类
{
Milk CreateMilk();//生产牛奶
Yogurt CreateYogurt();//生产酸奶
}
4.具体工厂(伊利工厂,蒙牛工厂)
class YLFactory:Factory//伊利工厂
{
public Milk CreateMilk()//生产伊利牛奶
{
return new YLMilk();
}
public Yogurt CreateYogurt()//生产伊利酸奶
{
return new YLYogurt();
}
}
class MNFactory:Factory//蒙牛工厂
{
public MNMilk CreateMilk()//生产蒙牛牛奶
{
return new MNMilk();
}
public MNYogurt CreateYogurt()//生产蒙牛酸奶
{
return new MNYogurt();
}
5.使用该工厂
namespace 抽象工厂模式
{
class Program
{
static void Main(string[] args)
{
Factory fact1 = new YLFactory();
Milk milk;
milk = fact1.CreateMilk();
milk.Display();
Yogurt yogurt;
yogurt= fact1.CreateYogurt();
yogurt.Display();
Console.ReadLine();
}
}
}
整合后的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 抽象工厂模式
{
class Program
{
static void Main(string[] args)
{
Factory fact1 = new YLFactory();
Milk milk;
milk = fact1.CreateMilk();
milk.Display();
Yogurt yogurt;
yogurt= fact1.CreateYogurt();
yogurt.Display();
Console.ReadLine();
}
}
}
interface Milk//所有牛奶的父类
{
void DisPlay();//显示牛奶品牌
}
interface Yogurt//所有酸奶的父类
{
void Display();//显示酸奶品牌
}
class YLMilk:Milk//伊利牛奶
{
public void DisPlay()
{
Console.WriteLine("我是伊利牛奶!");
}
}
class MNMilk:Milk//蒙牛牛奶
{
public void DisPlay()
{
Console.WriteLine("我是蒙牛牛奶!");
}
}
class YLYogurt:Yogurt//伊利酸奶
{
public void Display()
{
Console.WriteLine("我是伊利酸奶!");
}
}
class MNMilk:Yogurt//蒙牛酸奶
{
public void Display()
{
Console.WriteLine("我是蒙牛酸奶!");
}
}
interface Factory//所有工厂的父类
{
Milk CreateMilk();//生产牛奶
Yogurt CreateYogurt();//生产酸奶
}
class YLFactory:Factory//伊利工厂
{
public Milk CreateMilk()//生产伊利牛奶
{
return new YLMilk();
}
public Yogurt CreateYogurt()//生产伊利酸奶
{
return new YLYogurt();
}
}
class MNFactory:Factory//蒙牛工厂
{
public MNMilk CreateMilk()//生产蒙牛牛奶
{
return new MNMilk();
}
public MNYogurt CreateYogurt()//生产蒙牛酸奶
{
return new MNYogurt();
}
}
总之一点,在抽象工厂模式中,客户端必须针对接口编程,绝对不能针对具体的实现类编程。否则无法保证程序的扩展性和灵活性。不仅仅抽象工厂,在其他的工厂模式中也都是针对接口(抽象)编程。
如果对于抽象工厂模式,你有更好的见解,欢迎评论区留言讨论。