抽象工厂模式

通用原则:在可能的情况下尽量使用基类的方法
 与简单抽象工厂的区别:
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();

你可能感兴趣的:(抽象工厂模式)