其实在看到抽象工厂模式的时候,属实让我纠结了好久。这个抽象工厂模式和工厂模式有啥区别呢?感觉比工厂模式复制了好多,但是用起来貌似还没什么具体的区别。总有一种似是而非的感觉。貌似有区别,又貌似没区别。
可是既然是两种设计模式,总是有区别的吧?
网上查到资料总是这么说:
工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类;
抽象工厂模式:为创建一组或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
字面意思看明白了,可是还有没明白。懵!
还有说区别在于产品,如果产品单一,最适合用工厂模式,但是如果有多个业务品种,业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
其实还是不太明白。
后来看到一句话,我悟了:
区别在于,抽象工厂里一个工厂要生产多个产品,当抽象工厂生产的产品只有一个时,就叫工厂模式了。
说的是呐。原来这样。明白了。
比如,上文说的各种食物,每个食物有一个单一的工厂类。
我们知道现在各个快餐都有一种套餐的形式,可以让我们不用纠结一样一样的选。这样我们就可以通过套餐来选择了。
用到设计模式中,也就是,把一个一个的食物再进行抽象,然后再分类,然后在工厂中,每次返回一种食物,改为返回多种食物,那么就是抽象工厂模式了。
我理解的就是这样的,可以给大家参考一下。
继续上代码,这次把产品再抽象分为吃的和喝的两种,然后工厂类返回一个吃的和一个喝的,就是抽象工厂模式了。
// 食物虚类
public abstract class KFCFood
{
public abstract string GetFood();
}
// 原味鸡
public class KFCYuanweiji : KFCFood
{
public override string GetFood()
{
return "原味鸡";
}
}
// 蛋挞
public class KFCDanta : KFCFood
{
public override string GetFood()
{
return "蛋挞";
}
}
// 奥尔良鸡腿堡
public class KFCAoerliang : KFCFood
{
public override string GetFood()
{
return "奥尔良鸡腿堡";
}
}
// 饮料虚类
public abstract class KFCDrink
{
public abstract string GetDrink();
}
// 百事可乐
public class PepsleCola : KFCDrink
{
public override string GetDrink()
{
return "百事可乐";
}
}
// 豆浆
public class Doujiang : KFCDrink
{
public override string GetDrink()
{
return "豆浆";
}
}
// 咖啡
public class Coffee : KFCDrink
{
public override string GetDrink()
{
return "阿拉比咖啡";
}
}
// 套餐虚类即工厂类
public abstract class Package
{
public override KFCFood CreateFood();
public override KFCDrink CreateDrink();
}
// 套餐子类即工厂子类
public class CheapPackage : Package
{
public KFCFood CreateFood()
{
return new KFCYuanweiji();
}
public KFCDrink CreateDrink()
{
return new Doujiang();
}
}
// 套餐子类即工厂子类
public class HighPricePackage : Package
{
public KFCFood CreateFood()
{
return new KFCYuanweiji();
}
public KFCDrink CreateDrink()
{
return new Coffee();
}
}
然后客户端这样调用。
Package package = new CheapPackage();
KFCFood food = package.CreateFood();
food.GetFood();
KFCDrink drink = package.CreateDrink();
drink.GetDrink();
知行办公,专业移动办公平台
https://zx.naton.cn/
【总监】十二春秋之,3483099@qq.com;
【Master】zelo,616701261@qq.com;
【运营】运维艄公,897221533@qq.com;
【产品设计】流浪猫,364994559@qq.com;
【体验设计】兜兜,2435632247@qq.com;
【iOS】淘码小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com;
【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com;
【java】首席工程师MR_W,feixue300@qq.com;
【测试】土镜问道,847071279@qq.com;
【数据】fox009521,42151960@qq.com;
【安全】保密,你懂的。