当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。
每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。
2.系统的产品有多于一个的产品族,而系统只消费其中某一族的产品(抽象工厂模式的原始用意Unix&Windows)
Button--->UnixButton/WinButton
Text----->UnixText/WinText
Unix产品族和Windows产品族,不会同时使用。
Factory--->UnixFactory/WinFactory
3.同属于同一个产品族是在一起使用的。这一约束必须在系统的设计中体现出来。
4.系统提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于实现。
每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。
一、使用场景
1.系统不依赖于产品类实例如何被创建,组合和表达的细节。2.系统的产品有多于一个的产品族,而系统只消费其中某一族的产品(抽象工厂模式的原始用意Unix&Windows)
Button--->UnixButton/WinButton
Text----->UnixText/WinText
Unix产品族和Windows产品族,不会同时使用。
Factory--->UnixFactory/WinFactory
3.同属于同一个产品族是在一起使用的。这一约束必须在系统的设计中体现出来。
4.系统提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于实现。
二、java代码
产品类:
public abstract class Engine {
}
public abstract class CarMP3 {
}
public class BigEngine extends Engine { public BigEngine() { System.out.println("----------bigEngine"); } }
public class SmallEngine extends Engine { public SmallEngine() { System.out.println("----------smallEngine"); } }
public class RedCarMP3 extends CarMP3 { public RedCarMP3(){ System.out.println("----------redCarMP3"); } }
public class YellowCarMP3 extends CarMP3 { public YellowCarMP3(){ System.out.println("---------yellowCarMP3"); } }
工厂类:
public interface CarFactory {
CarMP3 getCarMP3();
Engine getEngine();
}
public class RedCarFactory implements CarFactory { @Override public CarMP3 getCarMP3() { return new RedCarMP3(); } @Override public Engine getEngine() { return new BigEngine(); } }
public class YellowCarFactory implements CarFactory { @Override public CarMP3 getCarMP3() { return new YellowCarMP3(); } @Override public Engine getEngine() { return new SmallEngine(); } }
测试类:
public class TestMain { public static void main(String[] args) { CarFactory redCarFactory = new RedCarFactory(); CarMP3 redCarMP3 = redCarFactory.getCarMP3(); Engine bigEngine = redCarFactory.getEngine(); CarFactory yellowCarFactory = new YellowCarFactory(); CarMP3 yellowCarMP3 = yellowCarFactory.getCarMP3(); Engine smallEngine = yellowCarFactory.getEngine(); } }