抽象工厂模式

通用原则:在可能的情况下尽量使用基类的方法
 与简单抽象工厂的区别:
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 2005-11-28 23:40  泽来  阅读(608)  评论(0编辑  收藏  举报