什么是抽象工厂模式
不关心零件的具体实现,只关心接口,仅使用该接口将零件组装成为产品。
例子
不同厂商生产多个产品
AbstractFactory 生产冰箱空调电视机
package CreationPattern.AbstractFactoryMode;
/**
* 抽象工厂
*/
public interface AbstractFactory {
Refrigerator createRefrigerator ();
AirConditioning createAirConditioning ();
TV createTV();
}
Refrigerator
package CreationPattern.AbstractFactoryMode;
/**
* 冰箱
*/
public class Refrigerator {
public Refrigerator(String s) {
System.out.println("create " + s + " refrigerator");
}
}
AirConditioning
package CreationPattern.AbstractFactoryMode;
/**
* 空调
*/
public class AirConditioning {
public AirConditioning(String s) {
System.out.println("create " + s + " airConditioning");
}
}
TV
package CreationPattern.AbstractFactoryMode;
/**
* 电视机
*/
public class TV {
public TV(String s) {
System.out.println("create " + s + " tv");
}
}
HaierFactory
package CreationPattern.AbstractFactoryMode;
/**
* 海尔品牌工厂
*/
public class HaierFactory implements AbstractFactory{
String brand = "Haier";
@Override
public Refrigerator createRefrigerator() {
return new Refrigerator(brand);
}
@Override
public AirConditioning createAirConditioning() {
return new AirConditioning(brand);
}
@Override
public TV createTV() {
return new TV(brand);
}
}
GeliFactory
package CreationPattern.AbstractFactoryMode;
/**
* 格力品牌工厂
*/
public class GeliFactory implements AbstractFactory{
private String brand = "Geli";
@Override
public Refrigerator createRefrigerator() {
return new Refrigerator(brand);
}
@Override
public AirConditioning createAirConditioning() {
return new AirConditioning(brand);
}
@Override
public TV createTV() {
return new TV(brand);
}
}
Main
package CreationPattern.AbstractFactoryMode;
/**
* Main
*/
public class Main {
public static void main(String[] args) {
AbstractFactory haierFactory = new HaierFactory();
haierFactory.createRefrigerator();
haierFactory.createAirConditioning();
haierFactory.createTV();
AbstractFactory geliFactory = new GeliFactory();
geliFactory.createRefrigerator();
geliFactory.createAirConditioning();
geliFactory.createTV();
}
}
结果
总结
抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;
抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交道。
抽象工厂易于增加具体的工厂,而难以增加新的零件。从上述例子也不难看出,在AbstractFactory类中增加一个产品例如洗衣机,所有的具体工厂都需要增加洗衣机,而增加一个具体的工厂例如海信工厂只需实现AbstractFactory类。
简单工厂、工厂方法、抽象工厂区别
简单工厂:单个产品对应单个厂商,1对1。例如空调工厂只生产格力空调
工厂方法:单个产品对应多个厂商,1对多。例如空调工厂生成格力空调,还生产海尔空调
抽象工厂:多个产品对应多个厂商,多对多。例如工厂不仅生产不同品牌的空调,还生产不同品牌的冰箱。
总之,我的理解是抽象工厂和工厂方法的主要区别在于生产能力的不同。