工厂方法模式考虑的是一类产品的生产,如电视机厂只生成电视机、披萨店只生产披萨等。
同类产品称为同等级,也就是说:工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类)的产品。如农场里既养动物又种植物,肯德基既生产汉堡有生产炸鸡等。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族,如下图所示的海尔工厂和 TCL 工厂所生成的电视机和空调的对应关系。
抽象工厂模式提供一个接口,用于创建相关或相互依赖对象的家族,而不需要指定所要产品的具体类。
使用抽象工厂模式一般要满足以下条件:
抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等四个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。
package com.erlang.factory.abstract_;
/**
* @description: 纽约披萨
* @author: erlang
* @since: 2022-02-08 22:28
*/
public class NYPizzaStore extends PizzaStore {
@Override
protected Pizza createPizza(String type) {
Pizza pizza = null;
PizzaIngredientFactory factory = new NYPizzaIngredientFactory();
if (type.equals("cheese")) {
pizza = new CheesePizza(factory);
pizza.setName("NY Style Cheese Pizza");
} else if (type.equals("clam")) {
pizza = new ClamPizza(factory);
pizza.setName("NY Style Clam Pizza");
}
return pizza;
}
}
package com.erlang.factory.abstract_;
/**
* @description: 芝加哥披萨成分加工工厂
* @author: erlang
* @since: 2022-02-09 22:38
*/
public interface PizzaIngredientFactory {
/**
* 面团
*
* @return 面团
*/
Dough createDough();
/**
* 酱汁
* @return
*/
Sauce createSauce();
}
package com.erlang.factory.abstract_;
/**
* @description: 纽约披萨
* @author: erlang
* @since: 2022-02-09 22:59
*/
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Dough createDough() {
return new ThinCrustDough("Thin Crust Dough");
}
@Override
public Sauce createSauce() {
return new MarinaraSauce("Marinara Sauce");
}
}
package com.erlang.factory.abstract_;
/**
* @description: 芝加哥披萨
* @author: erlang
* @since: 2022-02-09 22:39
*/
public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
@Override
public Dough createDough() {
return new ThickCrustDough("Extra Thick Crust Dough");
}
@Override
public Sauce createSauce() {
return new PlumTomatoSauce("Plum Tomato Sauce");
}
}
package com.erlang.factory.abstract_;
/**
* @description: 面团接口
* @author: yj
* @since: 2022-02-09 22:42
*/
public interface Dough {
/**
* 面团
*
* @return 返回面团
*/
String getDough();
}
package com.erlang.factory.abstract_;
/**
* @description:
* @author: erlang
* @since: 2022-02-09 22:53
*/
public class ThickCrustDough implements Dough {
private String dough;
public ThickCrustDough(String dough) {
this.dough = dough;
}
@Override
public String getDough() {
return dough;
}
}
package com.erlang.factory.abstract_;
/**
* @description:
* @author: erlang
* @since: 2022-02-09 22:57
*/
public class ThinCrustDough implements Dough {
private String dough;
public ThinCrustDough(String dough) {
this.dough = dough;
}
@Override
public String getDough() {
return dough;
}
}
package com.erlang.factory.abstract_;
/**
* @description:
* @author: erlang
* @since: 2022-02-09 22:44
*/
public interface Sauce {
/**
* 酱汁
*
* @return 酱汁
*/
String getSauce();
}
package com.erlang.factory.abstract_;
/**
* @description:
* @author: erlang
* @since: 2022-02-09 22:55
*/
public class PlumTomatoSauce implements Sauce {
private String sauce;
public PlumTomatoSauce(String sauce) {
this.sauce = sauce;
}
@Override
public String getSauce() {
return sauce;
}
}
package com.erlang.factory.abstract_;
/**
* @description:
* @author: erlang
* @since: 2022-02-09 22:57
*/
public class MarinaraSauce implements Sauce {
private String sauce;
public MarinaraSauce(String sauce) {
this.sauce = sauce;
}
@Override
public String getSauce() {
return sauce;
}
}
package com.erlang.factory.abstract_;
/**
* @description: 奶酪披萨
* @author: erlang
* @since: 2022-02-08 21:23
*/
public class CheesePizza extends Pizza {
PizzaIngredientFactory ingredientFactory;
public CheesePizza(PizzaIngredientFactory ingredientFactory) {
this.ingredientFactory = ingredientFactory;
}
@Override
public void prepare() {
System.out.printf("Preparing %s Pizza\n", name);
dough = ingredientFactory.createDough();
sauce = ingredientFactory.createSauce();
}
}