随笔 - 57  文章 - 18  评论 - 98  阅读 - 82740

抽象工厂模式

通用原则:在可能的情况下尽量使用基类的方法
 与简单抽象工厂的区别:
1.Factory用于创建一种类型的产品,而AbstractFactory用于创建产品族

抽象工厂的国种角色:
1.抽象工厂(Abstract Factory).   担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创立对象的工厂类必须实现这个接口,或继承这个类。

2.具体工厂(Concrete Factory).   这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。

3.抽象产品(Abstract Product).  担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。

4.具体产品(Concrete Factory).  抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。

抽象工厂模式结构图


以建房子为例,建造不同风格的房子. 中国式的,西方式的...
1.抽象产品
//抽象产品
public abstract class wall
{
    
}

public abstract class window
{
        
}

public abstract class door
{
    
}

2.抽象工厂

//抽象工厂
public abstract class builderAbstractFactory
{
    
public abstract wall CreateWall();
    
public abstract window CreateWindow();
    
public abstract door CreateDoor();
}
3.实际产品
//具体产品
public  class chinaWall:wall  //继承抽象产品
{
    
}

public  class chinaWindow:window
{
        
}

public  class chinaDoor:door
{
    
}

4.具体工厂
public class chinaBuilderFactory : builderAbstractFactory
{
    
public override wall CreateWall()
    
{
        
return new chinaWall();   
    }

    
public override window CreateWindow()
    
{
        
return new  chinaWindow();
    }

    
public override door CreateDoor()
    
{
        
return new chinaDoor();
    }

}
5客户端程序
 
//无论使用哪种风格这里永远不变
class Client
{
        
//抽象工厂对象
    builderAbstractFactory builder;
        
//抽象产品对象
    road ro;
    door dor;
    window win;
        
//使用哪个具体工厂的对象,这样达到不改变的目的
    public Client(builderAbstractFactory builder)
    
{
        
this.builder = builder;
    }

    
public void ready()
    
{
        ro 
= builder.CreateWall();
        dor 
= builder.CreateDoor();
        win 
= builder.CreateWindow();
    }

}
5.调用客户端程序
//如果有改变,只须传入对象里new不同的具体工厂对象
Client cl = new Client( new chinaBuilderFactory());
cl.ready();
posted on   泽来  阅读(609)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端

点击右上角即可分享
微信分享提示