using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DPC.Domain;
namespace DPC.CreateModel.AbstractFactory
{
class Program
{
static void Main(string[] args)
{
//小米生产线
IProductLineFactory xiaomiProductLine = new XiaoMiProductLineFactory();
xiaomiProductLine.CreateMobilePhone().Show(); //生产小米手机
xiaomiProductLine.CreatePad().Show();//生产小米平板
Console.WriteLine();
IProductLineFactory appleProductLine = new AppleProductLineFactory();
appleProductLine.CreateMobilePhone().Show(); //生产苹果手机
appleProductLine.CreatePad().Show();//生产苹果平板
Console.ReadKey();
}
}
/*
抽象工厂创建的往往是一到多个不同类型的实例,而不是某一个类型的实例。它将对象创建的思想由点到面进行延伸,体现的是一种具体到抽象的思维过程,
* 所以由此而得名抽象工厂(非官方解释,个人理解而已)。
*/
//工厂方法模式虽符合了开闭原则,但每个类的对象需要一个对应的工厂,当我们需要创建多种不同类型对象时那么工厂方法类数量就会剧增。
//所以,抽象工厂提出了产品族的概念,即相互关联的一类产品创建可以合并到一个实际工厂中的多个方法来创建,避免工厂类数量的爆炸。
//当然,抽象工厂仍存在对客户端调用繁琐的问题,这里也可以和工厂方法一样来借助简单工厂简化调用,具体请参考工厂方法与简单工厂结合代码。
/// <summary>
/// 产品线工厂接口(可生产不同的产品,比如生产手机、平板、电视等等)
/// </summary>
public interface IProductLineFactory
{
/// <summary>
/// 生产手机
/// </summary>
/// <returns></returns>
MobilePhone CreateMobilePhone();
/// <summary>
/// 生产平板
/// </summary>
/// <returns></returns>
Pad CreatePad();
}
public class AppleProductLineFactory : IProductLineFactory
{
public MobilePhone CreateMobilePhone()
{
return new IPhone("iphone5s", 5000);
}
public Pad CreatePad()
{
return new IPad("new ipad", 3000);
}
}
public class XiaoMiProductLineFactory : IProductLineFactory
{
public MobilePhone CreateMobilePhone()
{
return new XiaoMi("小米2s", 2200);
}
public Pad CreatePad()
{
return new XiaoMiPad("小米平板", 1999);
}
}
}
//简单工厂、工厂方法、抽象工厂
/*
三者的关系是由简单到复杂,后者都是对前者的缺点提出的优化方案
*/