抽象工厂模式
通用原则:在可能的情况下尽量使用基类的方法
与简单抽象工厂的区别:
1.Factory用于创建一种类型的产品,而AbstractFactory用于创建产品族
抽象工厂的国种角色:
1.抽象工厂(Abstract Factory). 担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创立对象的工厂类必须实现这个接口,或继承这个类。
2.具体工厂(Concrete Factory). 这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
3.抽象产品(Abstract Product). 担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
4.具体产品(Concrete Factory). 抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
抽象工厂模式结构图
以建房子为例,建造不同风格的房子. 中国式的,西方式的...
1.抽象产品
4.具体工厂
与简单抽象工厂的区别:
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
{
}
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 abstract class builderAbstractFactory
{
public abstract wall CreateWall();
public abstract window CreateWindow();
public abstract door CreateDoor();
}
//具体产品
public class chinaWall:wall //继承抽象产品
{
}
public class chinaWindow:window
{
}
public class chinaDoor:door
{
}
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客户端程序{
public override wall CreateWall()
{
return new chinaWall();
}
public override window CreateWindow()
{
return new chinaWindow();
}
public override door CreateDoor()
{
return new chinaDoor();
}
}
//无论使用哪种风格这里永远不变
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.调用客户端程序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();
}
}
//如果有改变,只须传入对象里new不同的具体工厂对象
Client cl = new Client( new chinaBuilderFactory());
cl.ready();
Client cl = new Client( new chinaBuilderFactory());
cl.ready();