第3章 抽象工厂模式
3.1 关于抽象工厂模式
我们在上面学习了,工厂方法模式,如果我们以前没有正确的使用过面向对象的知识。我们会惊讶 工厂方法模式 ,
oh my gad原来还有这种操作。这次我们即将学习的一种设计模式叫做 抽象工厂模式 。我们先来揣摩一下这个名字,能不能大概猜出它是怎样的呢。
我们不如先回顾一下 工厂方法模式 这个名字 工厂:我们让一个类使用其方法作为对象的创作者,外部只需要赋予它指令,工厂方法创建一个新的相应对象返回给调用者。抽象工厂模式是用一个工厂创建其他工厂。这个设计模式属于创建型模式,它提供了一种创建对象的方式。
抽象工厂模式 我们是不是要把工厂给抽象起来,用抽象类实现,编写出许多工厂类继承抽象工厂类,各自的工厂类实现创建相应的对象实体。以实现隐藏对象创建的细节。
不要要慌,我们慢慢地往下面看。我希望你可以把这个系列地博客当做吃饭时可以快速阅读地小故事一样。利用碎片化的时间来达到学到知识的效果。
在这个互联网盛行的时代,我们好像都变得非常地忙碌,一天下来躺在床上一想今天好像没有做太多有价值地东西。但我相信,利用平时的点滴来积累我们总会比哪些没有学过的人要强许多。加油吧!禄哥一直会再次陪伴你,知道把这些常见的设计模式过一边,我不是什么有丰富经验的工作开发者,也不是某个领域的专家。我只是一个在双非学校没见过什么世面的无名本科生。我都可以坚持下去、何况你呢?
3.2 来一个小故事
一家衣服工厂,正在生产不同的衣服套装,例如上衣与下衣有不同的搭配,但总是按搭配成对生产的。也就是以生产就是一套。
然而有各种各样的上衣与下衣,我们怎样来构建一个易管理的程序呢。我们一起来看一看抽象工厂模式。
3.3 试着编写下代码
先看一下类图
可见创建一个超级工厂,这个超级工厂是抽象的,使用上衣工厂与下衣工厂来继承超级工厂,实现各自需要实现的工厂方法。
BottomDress 与 TopDress接口将上衣与下衣进行了抽象处理,并用各自的子类来实现其方法。
可见与工厂方法的区别就是,我们在工厂之上加了一层工厂,将创建工厂细节进行隐藏。往各个工厂下的逻辑与工厂方法模式是一致的。
抽象工厂在多个工厂且这些工厂创建的对象有某种意义上的联系时,用抽象工厂模式有便利于创作者。
其内部的开发者也便于增添删减内容,且有条有序。
main.java
测试样例
package AbstractFactoryPattern;
public class main {
private static AbstractFactory topFactory;
private static AbstractFactory bottomFactory;
public static void main(String[] args) {
//初始化工厂
topFactory=new TopDressFactory();
bottomFactory=new BottomDressFactory();
//进行生产
product("T恤","裙子");
product("大衣","牛仔裤");
}
//生产
public static void product(String top,String bottom){
TopDress topDress=topFactory.getTopDress(top);
BottomDress bottomDress=bottomFactory.getBottomDress(bottom);
topDress.name();
bottomDress.name();
System.out.println("------------");
}
}
运行结果:
T恤
裙子大衣
牛仔裤
AbstractFactory.java
超级抽象工厂
package AbstractFactoryPattern;
public abstract class AbstractFactory {
abstract TopDress getTopDress(String type);
abstract BottomDress getBottomDress(String type);
}
BottomDress.java
下衣接口
package AbstractFactoryPattern;
public interface BottomDress {
public void name();
}
TopDress.java
上衣接口
package AbstractFactoryPattern;
public interface TopDress {
public void name();
}
BottomDressFactory.java
下衣工厂
package AbstractFactoryPattern;
public class BottomDressFactory extends AbstractFactory{
@Override
TopDress getTopDress(String type) {
return null;
}
@Override
BottomDress getBottomDress(String type) {
BottomDress back=null;
if(type.equals("裙子")){
back=new Skirt();
}else if(type.equals("牛仔裤")){
back=new Jeans();
}
return back;
}
}
TopDressFactory.java
上衣工厂
package AbstractFactoryPattern;
public class TopDressFactory extends AbstractFactory{
@Override
TopDress getTopDress(String type) {
TopDress back=null;
if(type.equals("大衣")){
back=new Overcoat();
}else if(type.equals("T恤")){
back=new TShirt();
}
return back;
}
@Override
BottomDress getBottomDress(String type) {
return null;
}
}
Jeans.java
牛仔裤
package AbstractFactoryPattern;
public class Jeans implements BottomDress{
@Override
public void name() {
System.out.println("牛仔裤");
}
}
Skirt.java
裙子
package AbstractFactoryPattern;
public class Skirt implements BottomDress{
@Override
public void name() {
System.out.println("裙子");
}
}
Overcoat.java
大衣
package AbstractFactoryPattern;
public class Overcoat implements TopDress{
@Override
public void name() {
System.out.println("大衣");
}
}
TShirt.java
T恤
package AbstractFactoryPattern;
public class TShirt implements TopDress{
@Override
public void name() {
System.out.println("T恤");
}
}
总结
看完上面的内容,可能我们会感叹不就是在多个工厂的时候,为这些工厂再建一个工厂吗。
抽象工厂模式更适合于多个工厂的情况,使用抽象工厂模式更有利于对程序进行管理。