抽象工厂模式是在工厂模式的基础上更进一步抽象是围绕工厂的超级工厂展开,如果对工厂模式还不太了解的话可以去看看我上一篇工厂模式?
回顾设计模式之工厂模式(Factory Pattern),通过使用设计模式写Demo的方式记录一下,代码共享至码云
抽象工厂模式(Abstract Factory Pattern)基本介绍
- 类型:属于创建模式
- 特点:在工厂模式之上再一次抽象,围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂,这种类型的设计模式它提供了一种创建对象的最佳方式。
- 目的:提供一个创建一系列相关或相互依赖对象的接口,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
- 应用实例: 1、您需要一辆车,可以直接告诉经销商需要什么工厂的什么类型的车直接提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
- 优点:当一个产品系列中的多个对象被设计在一起时,它能保证客户端始终只使用指定的同一个产品系列中的对象。
- 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的工厂里加代码,又要在具体的里面加代码。
- 使用场景:当产品系列的数量固定且数量大于一时可以使用抽象工厂模式。因为产品系列难扩展,产品等级易扩展。
第一步:创建接口类
package abstractfactorypattern;
/*
*yzj
*奥迪实体接口
*/
public interface Audi{
public void run();
public void ride();
}
package abstractfactorypattern;
/*
- 宝马实体接口
*/
public interface Bwm {
public void run();
public void ride();
}
第二步:创建实体类实现接口
- 奥迪系列实体实现接口
package abstractfactorypattern;
/*
-
奥迪汽车实体类
*/
public class AutomobileAudi implements Audi{@Override
public void run() {
System.out.println(“奥迪汽车时速140km/h”);
}@Override
public void ride() {
System.out.println(“奥迪汽车可乘坐4人”);
}
}
package abstractfactorypattern;
/*
*yzj
*奥迪巴士实体类
*/
public class BusAudi implements Audi{@Override
public void run() {
System.out.println(“奥迪巴士100km/h”);
}@Override
public void ride() {
System.out.println(“奥迪巴士可乘坐50人”);
}
}
package abstractfactorypattern;
/*
*yzj
*奥迪赛车实体类
*/
public class RacingAudi implements Audi {@Override
public void run() {
System.out.println(“奥迪赛车时速400km/h”);
}@Override
public void ride() {
System.out.println(“奥迪赛车可乘坐1人”);
}
}
-
宝马系列实体实现接口
package abstractfactorypattern;
/*
*yzj
*宝马汽车实体类
*/
public class AutomobileBwm implements Bwm{@Override
public void run() {
System.out.println(“宝马汽车140km/h”);
}@Override
public void ride() {
System.out.println(“宝马汽车可乘坐7人”);
}
}
package abstractfactorypattern;
/*
*yzj
*宝马巴士实体类
*/
public class BusBwm implements Bwm{
@Override
public void run() {
System.out.println("宝马巴士110km/h");
}
@Override
public void ride() {
System.out.println("奥迪巴士可乘坐30人");
}
}
package abstractfactorypattern;
/*
*yzj
*宝马赛车实体类
*/
public class RacingBwm implements Bwm {
@Override
public void run() {
System.out.println("宝马赛车时速400km/h");
}
@Override
public void ride() {
System.out.println("宝马赛车可乘坐1人");
}
}
第三步:创建抽象工厂类
package abstractfactorypattern;
/*
*yzj
*抽象工厂类
/
public abstract class AbstractFactory {
/
*yzj
*获取工厂某类产品
*carType:需要的汽车类型
*return:各工厂生产的实体
*/
public abstract Bwm getBwm(String carType);
public abstract Audi getAudi(String carType);
}
第四步:创建实体工厂类继承抽象工厂类
package abstractfactorypattern;
/*
*yzj
*奥迪工厂类
*/
public class AudiFactory extends AbstractFactory{
@Override
public Bwm getBwm(String carType) {
return null;
}
@Override
public Audi getAudi(String carType) {
switch (carType) {
case "汽车":
return new AutomobileAudi();
case "巴士":
return new BusAudi();
case "赛车":
return new RacingAudi();
default:
return null;
}
}
}
package abstractfactorypattern;
/*
*yzj
*宝马工厂类
*/
public class BwmFactory extends AbstractFactory{
@Override
public Bwm getBwm(String carType) {
switch (carType) {
case "汽车":
return new AutomobileBwm();
case "巴士":
return new BusBwm();
case "赛车":
return new RacingBwm();
default:
return null;
}
}
@Override
public Audi getAudi(String carType) {
return null;
}
}
第五步:创建工厂的超级工厂(这里我理解成经销商他具有宝马和奥迪系列产品的货源)
package abstractfactorypattern;
/*
- 工厂经销商类
*/
public class FactoryDistributor {
public AbstractFactory getAbstractFactory(String factoryType) {
switch (factoryType) {
case “宝马”:
return new BwmFactory();
case “奥迪”:
return new AudiFactory();
default:
return null;
}
}
}
第五步:主函数使用抽象工厂模式创建对象(这里我模拟消费者去经销商选车)
package abstractfactorypattern;
/*
*yzj
*消费者(主类)
*/
public class Consumer {
public static void main(String[] args) {
//经销商对象
FactoryDistributor distributor=new FactoryDistributor();
//经销商有奥迪工厂的产品
AbstractFactory audiFactory=distributor.getAbstractFactory(“奥迪”);
//经销商有宝马工厂的产品
AbstractFactory bwmFactory=distributor.getAbstractFactory(“宝马”);
//消费者告诉经销商需要奥迪工厂的奥迪汽车
//奥迪工厂创建一辆奥迪汽车
Audi audiAutomobile=audiFactory.getAudi("汽车");
audiAutomobile.ride();//坐坐试试
audiAutomobile.run();//跑跑试试
//消费者又告诉经销商需要奥迪工厂的奥迪巴士
//奥迪工厂创建一辆奥迪巴士
Audi audiBus=audiFactory.getAudi("巴士");
audiBus.ride();//坐坐试试
audiBus.run();//跑跑试试
//消费者又又想需要奥迪工厂的奥迪赛车
Audi audiRacing=audiFactory.getAudi("赛车");
audiRacing.ride();//坐坐试试
audiRacing.run();//跑跑试试
System.out.println("---------------------又一天---------------------------------------------");
//消费者告诉经销商需要宝马工厂的宝马汽车
//奥迪工厂创建一辆宝马汽车
Bwm bwmAutomobile=bwmFactory.getBwm("汽车");
bwmAutomobile.ride();//坐坐试试
bwmAutomobile.run();//跑跑试试
//消费者又告诉经销商需要宝马工厂的宝马巴士
//奥迪工厂创建一辆宝马巴士
Bwm bwmBus=bwmFactory.getBwm("巴士");
bwmBus.ride();//坐坐试试
bwmBus.run();//跑跑试试
//消费者又又想需要宝马工厂的宝马赛车
Bwm bwmRacing=bwmFactory.getBwm("赛车");
bwmRacing.ride();//坐坐试试
bwmRacing.run();//跑跑试试
}
}