抽象工厂模式是一种创建模式,是与构建器和工厂模式一起最受欢迎的模式之一。 使用创建模式是为了创建对象,而不是直接使用构造函数创建对象。
抽象工厂模式提供了一种封装一组具有共同主题的单个工厂而无需指定其具体类的方法。
采用该模式的目的是使对象的创建与对象的使用隔离开来,并创建相关对象的族,而不必依赖于它们的具体类。
通过使用该模式,客户端不必知道对象及其实现细节。 抽象工厂的实现有责任实现对象并处理所有细节,以便成功完成此任务。
因此,让我们开始行动,开始解决问题。
假设我们负责各种产品的罐装过程。
关于罐装过程,必须创建两个对象。 罐的主体和罐的顶部。 同时考虑到我们可能具有各种罐头形式的事实,我们可能也拥有可以处理罐头过程的各种工厂。 例如,我们可能有一家啤酒罐头工厂或一家食品罐头工厂。
关于上面的描述,似乎抽象工厂是路要走。 我们确实有一系列对象,我们确实想隐藏这些对象的构造。
我们将从添加两个有关罐顶和罐体功能的接口开始。
package com.gkatzioura.design.creational.abstractfactory;public interface CanTop {void open();}
package com.gkatzioura.design.creational.abstractfactory;public interface CanBody {void fill();}
然后,我们将创建一个抽象工厂,该工厂将提供实现这些对象的方法。
package com.gkatzioura.design.creational.abstractfactory;public abstract class CanningFactory {public abstract CanTop createTop();public abstract CanBody createBody();}
如前所述,我们有啤酒罐的情况。 因此,我们将实现CanTop和CanBody类的实现。
package com.gkatzioura.design.creational.abstractfactory.beer;import com.gkatzioura.design.creational.abstractfactory.CanTop;public class BeerCanTop implements CanTop {public void open() {}
}
package com.gkatzioura.design.creational.abstractfactory.beer;import com.gkatzioura.design.creational.abstractfactory.CanBody;public class BeerCanBody implements CanBody {public void fill() {}
}
然后,我们将建立一个啤酒罐头工厂。
package com.gkatzioura.design.creational.abstractfactory.beer;import com.gkatzioura.design.creational.abstractfactory.CanBody;
import com.gkatzioura.design.creational.abstractfactory.CanTop;
import com.gkatzioura.design.creational.abstractfactory.CanningFactory;public class BeerCanningFactory extends CanningFactory {public CanTop createTop() {return new BeerCanTop();}public CanBody createBody() {return new BeerCanBody();}}
另一种情况是食品罐头。 在这种情况下,我们还将提供CanTop和CanBody类的实现。
package com.gkatzioura.design.creational.abstractfactory.food;import com.gkatzioura.design.creational.abstractfactory.CanBody;public class FoodCanBody implements CanBody {public void fill() {}
}
package com.gkatzioura.design.creational.abstractfactory.food;import com.gkatzioura.design.creational.abstractfactory.CanTop;public class FoodCanTop implements CanTop {public void open() {}
}
作为最后一步,我们将为食品罐头案例提供抽象的工厂实现。
package com.gkatzioura.design.creational.abstractfactory.food;import com.gkatzioura.design.creational.abstractfactory.CanBody;
import com.gkatzioura.design.creational.abstractfactory.CanTop;
import com.gkatzioura.design.creational.abstractfactory.CanningFactory;public class FoodCanningFactory extends CanningFactory {public CanTop createTop() {return new FoodCanTop();}public CanBody createBody() {return new FoodCanBody();}}
我们刚才所做的就是使用抽象工厂模式来创建有关装罐过程的一系列对象。 我们将创建过程与CanTop和CanBody的使用隔离开来。 同样,我们能够创建一系列对象,而无需依赖于它们的具体类。
您可以在github上找到源代码。
在下一篇博客文章中,我们将了解工厂模式。
另外,我还编写了备忘单,其中包含“创作设计模式”的摘要。
在链接中注册以接收它。
翻译自: https://www.javacodegeeks.com/2018/03/creational-design-patterns-abstract-factory-pattern.html