设计模式-抽象工厂模式

设计模式-抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)

工厂方法模式:针对单一对象的创建
抽象工厂模式:针对一组对象的创建

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。

上篇文章中讲解了工厂方法,这篇文章为了说明问题,现在加入Server这个基类,也就是说Server和PC是同等级别的,PC下面包括各种品牌,Server下面同样包括各种品牌。

先看下UML模型图
这里写图片描述

个人电脑基类

abstract class PC
{
    private string name;

    public PC(string name)
    {
        this.name = name;
    }

    public virtual string Name { get { return name; } set { name = value; } }

    public abstract void Describe();
}

Dell电脑具体类

class DellPC : PC
{
    public DellPC(string name) : base(name)
    {

    }

    public override void Describe()
    {
        System.Console.WriteLine("I am {0} personal computer", Name);
    }
}

IBM电脑具体类

class IBMPC : PC
{
    public IBMPC(string name) : base(name)
    {

    }

    public override void Describe()
    {
        System.Console.WriteLine("I am {0} personal computer", Name);
    }
}

服务器基类

abstract class Server
{
    private string name;

    public Server(string name)
    {
        this.name = name;
    }

    public virtual string Name { get { return name; } set { name = value; } }

    public abstract void Describe();
}

Dell服务器具体类

class DellServer : Server
{
    public DellServer(string name) : base(name)
    {

    }

    public override void Describe()
    {
        System.Console.WriteLine("I am {0} server", Name);
    }
}

IBM服务器具体类

class IBMServer : Server
{
    public IBMServer(string name) : base(name)
    {

    }

    public override void Describe()
    {
        System.Console.WriteLine("I am {0} server", Name);
    }
}

抽象工厂

abstract class Factory
{
    public abstract PC CreatePC();//生产电脑
    public abstract Server CreateServer();//生产服务器
}

具体Dell工厂

class DellFactory : Factory
{
    public override PC CreatePC()
    {
        return new DellPC("DellPC");//生产Dell电脑
    }

    public override Server CreateServer()
    {
        return new DellServer("DellServe");//生产Dell服务器
    }
}

具体IBM工厂

class IBMFactory : Factory
{
    public override PC CreatePC()
    {
        return new IBMPC("IBMPC");//生产IBM电脑
    }
    public override Server CreateServer()
    {
        return new IBMServer("IBMServer");//生产IBM服务器
    }
}

以下代码是错误的类别划分方式

    abstract class DellInc { }  //Dell公司的产品
    class dpc : DellInc { }     //Dell电脑     
    class dsrv : DellInc { }    //Dell服务器 

    abstract class IBMInc { }   //IBM公司的产品
    class ipc : IBMInc { }      //IBM电脑
    class isrv : IBMInc { }     //IBM服务器

    abstract class FactoryMix   //混合工厂   
    {
        public abstract DellInc CreateDell();   //生产Dell产品
        public abstract IBMInc CreateIBM();     //生产IBM产品
        //假设这里再来一个HP呢,可想而知情况将会变得多么复杂
    }
    abstract class Dell_Factory : FactoryMix
    {
        public abstract dpc CreateDellPC();     //生产Dell电脑
        public abstract dsrv CreateDellServer();//生产Dell服务器
        //请问IBM产品在这里实现吗,注意为了说明问题现在Dell_Factory是抽象类   
    }

    abstract class IBM_Factory : FactoryMix
    {
        public abstract ipc CreateIBMPC();      //生产IBM电脑         
        public abstract isrv CreateIBMServer(); //生产IBM服务器      
    }

    class Dell_Factory2 : FactoryMix
    {
        //又或者同时实现4样产品
        public override DellInc CreateDell() { return new dpc(); }      //只能生产Dell电脑
        //public override DellInc CreateDell() { return new dsrv(); }   //或者只生产Dell服务器   
        public override IBMInc CreateIBM() { return new ipc(); }        //只能生产IBM电脑
        //public override IBMInc CreateIBM() { return new isrv(); }     //或者只生产IBM服务器
    }   

调用方式


            Console.WriteLine("Dell Production");     

            Factory dellfactory = new DellFactory();        //Create dell factory 

            PC dellpc = dellfactory.CreatePC();             //make dell pc
            dellpc.Name = "d-pc";
            dellpc.Describe();

            Server dellserver = dellfactory.CreateServer(); //make dell server
            dellpc.Name = "d-srv";
            dellserver.Describe();


            Console.Write("\n");
            System.Console.WriteLine("IBM Production");


            Factory ibmfactory = new IBMFactory();           //Create ibm factory 

            PC ibmpc = ibmfactory.CreatePC();                //make ibm pc
            ibmpc.Name = "R60e";
            ibmpc.Describe();

            Server ibmserver = ibmfactory.CreateServer();    //make ibm server
            ibmserver.Name = "x860";
            ibmserver.Describe();

运行结果
这里写图片描述

抽象工厂模式的优点
抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。

抽象工厂模式的缺点
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

适用场景
当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。

版权所有,转载请注明文章出处 http://blog/youkuaiyun.com/cadenzasolo

### 抽象工厂模式概述 抽象工厂模式是一种创建型设计模式,其核心在于提供了一种方式来创建一系列相关或相互依赖的对象,而不必指定它们的具体类[^2]。通过这种方式,客户端能够使用统一的接口来获取所需的产品实例,从而降低了系统组件之间的耦合度。 #### 模式的结构与工作原理 该模式主要由四个部分组成: - **抽象工厂(Abstract Factory)**:定义了一个用于创建一族具体产品对象的方法集合。 - **具体工厂(Concrete Factory)**:实现了抽象工厂所声明的操作,负责生产特定种类的产品系列。 - **抽象产品(Abstract Product)**:为每一种可能被生产的物品设定了通用接口。 - **具体产品(Concrete Product)**:实际要创建出来的实体类,继承自相应的抽象产品并实现其功能。 当客户请求某个类型的对象时,会调用相应工厂里的方法得到想要的结果;由于整个过程中只涉及到高层模块对于低层模块的引用(即仅知道如何操作抽象级别的成员),因此即使内部逻辑发生变化也不会影响到外部使用者。 #### 应用场景分析 此模式非常适合应用于以下情况: - 当应用程序存在多个可互换的产品线,并希望保持独立性以便于扩展新特性时不破坏现有代码; - 需要在运行期间动态决定应该采用哪一套设计方案来进行构建; - 要求确保同一版本下的各个组成部分始终一致地协同运作。 例如,在图形库中可以根据不同的渲染引擎选择合适的形状绘制器(如OpenGL vs DirectX)。再比如操作系统风格切换工具里根据不同主题调整窗口控件外观等都是很好的例子。 #### Java实现案例展示 下面给出一段简单的Java代码片段用来说明上述概念的应用: ```java // 定义两个层次的产品接口 public interface GUIFactory { Button createButton(); } public interface Button { void paint(); } ``` 接着分别针对Windows和MacOS平台定制化各自的GUI元素: ```java // Windows风格按钮 class WinButton implements Button { public void paint() { System.out.println("Render a button in the Windows style."); } } // MacOS风格按钮 class MacButton implements Button { public void paint() { System.out.println("Render a button in the macOS style."); } } ``` 最后建立对应的工厂类完成最终组装: ```java // 创建适用于Windows系统的UI部件制造者 class WinFactory implements GUIFactory { @Override public Button createButton() { return new WinButton(); } } // 创建适用于macOS系统的UI部件制造者 class MacFactory implements GUIFactory { @Override public Button createButton() { return new MacButton(); } } ``` 这样就可以很容易地根据当前环境配置选取适当的主题样式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值