一、描述
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。好比不同品牌下有各式各样的商品。
二、优劣势
优点:用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件 体系结构的优化。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象里加代码,又要在具体的里面加代码。
三、需求
生产鼠标,有2个品牌,惠普和戴尔,每个品牌都能成产鼠标和键盘。
四、使用其他设计模式
简单工厂:https://blog.csdn.net/dicunsi2939/article/details/103922023
工厂模式:https://blog.csdn.net/dicunsi2939/article/details/103923644
如果我们这边也使用工厂模式,那么就会出现惠普鼠标工厂、惠普键盘工厂,那么从名字来看就有点耦合了,都是惠普工厂,干嘛还分鼠标和键盘,所以我们引用抽象工厂。
五、使用设计模式
通过添加工厂类,生成产品的工作交给它来负责。
3个类,
MouseBase.cs -鼠标基类
HpMouse.cs -惠普鼠标类
DellMouse.cs -戴尔鼠标类
KeyBoardBase.cs 键盘基类
Hp KeyBoard.cs -惠普键盘类
Dell KeyBoard.cs -戴尔键盘类
FactoryBase.cs -抽象工厂基类
HpFactory.cs -惠普工厂
DellFactory.cs -戴尔工厂
//鼠标基类
public abstract class MouseBase
{
public abstract void Show();
}
//惠普鼠标
public class HpMouse : MouseBase
{
public override void Show()
{
Debug.Log("惠普鼠标老品牌值得信赖!");
}
}
//戴尔鼠标
public class DellMouse : MouseBase
{
public override void Show()
{
Debug.Log("戴尔鼠标带给你不一样的惊喜!");
}
}
//惠普键盘
public class HpKeyBoard : KeyBoardBase
{
public override void Show()
{
Debug.Log("惠普键盘!");
}
}
//戴尔键盘
public class DellKeyBoard : KeyBoardBase
{
public override void Show()
{
Debug.Log("戴尔键盘");
}
}
//抽象工厂基类
public abstract class FactoryBase
{
public abstract MouseBase CreateMouse();
public abstract KeyBoardBase CreateKeyBoard();
}
//惠普工厂
public class HpFactory : FactoryBase
{
public override KeyBoardBase CreateKeyBoard()
{
return new HpKeyBoard();
}
public override MouseBase CreateMouse()
{
return new HpMouse();
}
}
//戴尔工厂
public class DellFactory : FactoryBase
{
public override KeyBoardBase CreateKeyBoard()
{
return new DellKeyBoard();
}
public override MouseBase CreateMouse()
{
return new DellMouse();
}
}
//客户端调用
public static void main(string[] args)
{
FactoryBase factory = new HpFactory();
//生产惠普鼠标和键盘
factory.CreateMouse();
factory.CreateKeyBoard();
factory = new DellFactory();
//生产戴尔鼠标和键盘
factory.CreateMouse();
factory.CreateKeyBoard();
}
运行结果
小结:我们抽象除一个工厂基类,里面是可生产的产品,然后每个品牌作为一个工厂类去继承它,这样就把同一个品牌的产品合并到同一个工厂了。
六、设计图
通过学习,我们了解到了简单工厂模式的应用,我们把刚刚的实现方式画出来。
//没什么人看,就不画了。
七、总结
工厂模式和抽象工厂的区分为:是否有品牌多产品这一说。抽象工厂扩展起来比较麻烦,需要添加每个品牌的具体产品对象,也就是一个产品有几个牌子就得写几个类,然后还得去工厂类里加上创建得方法。但不耦合就是了。
觉得有用就留下评论吧^-^
来源:CSDN
作者:乱世浮生Y
链接:https://blog.csdn.net/dicunsi2939/article/details/103989612