过气的,终究是过气了
上一章简单介绍了工厂模式(四), 如果没有看过,请观看上一章
工厂方法模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。
将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。
组成角色 | 具体 | 关系 | 作用 |
---|---|---|---|
抽象产品(Product) | Pizza | 具体产品的父类 | 描述具体产品的公共接口 |
具体产品(Concrete Product) | Chinese1,Eluosi1 | 抽象产品的子类;工厂类创建的目标类 | 描述生产的具体产品 |
抽象工厂(Creator) | AbsOrderPizzaFactory | 具体工厂的父类 | 描述具体工厂的公共接口 |
具体工厂(Concrete Creator) | ChineseAbsOrderPizzaFactoryFactory 等 | 抽象工厂的子类;被外界调用 | 描述具体工厂;实现FactoryMethod工厂方法创建产品的实例 |
public interface Pizza {
void make();
}
@Slf4j
public class ChineseBluePizza implements Pizza{
@Override
public void make() {
log.info("制作中国蓝色披萨");
}
}
@Slf4j
public class ChineseRedPizza implements Pizza{
@Override
public void make() {
log.info("制作中国红披萨");
}
}
@Slf4j
public class EluosiBluePizza implements Pizza{
@Override
public void make() {
log.info("制作俄罗斯蓝色披萨");
}
}
@Slf4j
public class EluosiRedPizza implements Pizza{
@Override
public void make() {
log.info("制作俄罗斯红披萨");
}
}
public interface AbsOrderPizzaFactory {
public Pizza createPizaa (String type);
}
public class ChineseAbsOrderPizzaFactoryFactory implements AbsOrderPizzaFactory {
@Override
public Pizza createPizaa(String type) {
if ("red".equalsIgnoreCase(type)){
return new ChineseRedPizza();
}else if ("blue".equalsIgnoreCase(type)){
return new ChineseBluePizza();
}else {
return null;
}
}
}
public class EluosiAbsOrderPizzaFactoryFactory implements AbsOrderPizzaFactory {
@Override
public Pizza createPizaa(String type) {
if ("red".equalsIgnoreCase(type)){
return new EluosiRedPizza();
}else if ("blue".equalsIgnoreCase(type)){
return new EluosiBluePizza();
}else {
return null;
}
}
}
@Test
public void oneTest() {
AbsOrderPizzaFactory absOrderPizzaFactory = new ChineseAbsOrderPizzaFactoryFactory();
Pizza pizza = absOrderPizzaFactory.createPizaa("red");
pizza.make();
pizza = absOrderPizzaFactory.createPizaa("blue");
pizza.make();
absOrderPizzaFactory = new EluosiAbsOrderPizzaFactoryFactory();
pizza = absOrderPizzaFactory.createPizaa("red");
pizza.make();
}
如果现在新增加 美国的 蓝色 和红色 披萨, 那么不需要改变之前的东西, 只需要增加具体的产品和具体的工厂实现即可
@Slf4j
public class MeiBluePizza implements Pizza{
@Override
public void make() {
log.info("制作美国蓝色披萨");
}
}
@Slf4j
public class MeiRedPizza implements Pizza{
@Override
public void make() {
log.info("制作美国红披萨");
}
}
public class MeiAbsOrderPizzaFactoryFactory implements AbsOrderPizzaFactory {
@Override
public Pizza createPizaa(String type) {
if ("red".equalsIgnoreCase(type)){
return new MeiRedPizza();
}else if ("blue".equalsIgnoreCase(type)){
return new MeiBluePizza();
}else {
return null;
}
}
}
@Test
public void twoTest() {
AbsOrderPizzaFactory absOrderPizzaFactory = new MeiAbsOrderPizzaFactoryFactory();
Pizza pizza = absOrderPizzaFactory.createPizaa("red");
pizza.make();
pizza = absOrderPizzaFactory.createPizaa("blue");
pizza.make();
}
工厂方法不支持 产品族, 只是生成一个单一的对象实例
本章节的代码放置在 github 上:
https://github.com/yuejianli/DesignPattern/tree/develop/MethodFactory
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!