首先说下什么是抽象工厂模式:
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
然后说下抽象工厂模式的应用场景:
1、QQ 换皮肤,一整套一起换。
2、生成不同操作系统的程序。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:代码耦合度太高,不易于扩展.
抽象工厂模式的理念就是建立一个抽象工厂,然后其他的工厂都继承这个工厂.
逻辑大概是:
订单通过入口传递到工厂控制处,控制处根据不同的工厂需求来创建不同的工厂,然后再根据不同的的货物订单由对应的工厂调用对应的生产线,生产订单所需产品.
理念大致如上文所述,那么接下来简单说下抽象工厂模式的几个文件,本博文所涉及的文件一共11个,其结构如下图所示:
具体代码如下图所示:
接口:
package com.example.abstractFactoryPattern;
/**
* Created by zhangrui on 2018/4/20.
*/
/*/**
* @author zhangrui
* @Description 食物接口,可以类比食物生产许可证
* @Date 10:31 2018/4/20
* @Param
* @returu
**/
public interface Food {
public void creat();
}
package com.example.abstractFactoryPattern;
/**
* Created by zhangrui on 2018/4/20.
*/
/*/**
* @author zhangrui
* @Description 包装接口,类似包装生产许可证
* @Date 16:52 2018/4/20
* @Param
* @returu
**/
public interface Packaging {
public void givePackage();
}
对应的实现类:
package com.example.abstractFactoryPattern;
/**
* Created by zhangrui on 2018/4/20.
*/
/*
* @ClassName DumplingProductLine
*@Description TODO 饺子类(类比生产线) 这条生产线具有生产食物的资质 根据自身需求专门用来生产--饺子
*@Author zhangrui
*@Date 10:31 10:31
*@Version
* */
public class DumplingProductLine implements Food {
@Override
public void creat() {
ceretDumpling();
}
private void ceretDumpling() {
System.out.println("工厂生产了饺子(I'm a fresh Dumpling)");;
}
}
package com.example.abstractFactoryPattern;
/**
* Created by zhangrui on 2018/4/20.
*/
/*
* @ClassName NoodleProductLine
*@Description TODO 面条类(类比生产线) 这条生产线具有生产食物的资质 根据自身需求专门用来生产--面条
*@Author zhangrui
*@Date 10:30 10:30
*@Version
* */
public class NoodleProductLine implements Food {
@Override
public void creat() {
creatNoodle();
}
private void creatNoodle() {
System.out.println( "工厂生产了面条(I'm a noodle)");
}
}
package com.example.abstractFactoryPattern;
/**
* Created by zhangrui on 2018/4/20.
*/
/*
* @ClassName PaperProductLine
*@Description TODO
*@Author zhangrui
*@Date 15:16 15:16
*@Version
* */
public class PaperProductLine implements Packaging {
@Override
public void givePackage() {
System.out.println( "生产纸包装");
}
}
package com.example.abstractFactoryPattern;
/**
* Created by zhangrui on 2018/4/20.
*/
/*
* @ClassName PlasticProductLine
*@Description TODO
*@Author zhangrui
*@Date 15:13 15:13
*@Version
* */
public class PlasticProductLine implements Packaging {
@Override
public void givePackage() {
System.out.println("生产塑料包装");
}
}
创建抽象工厂:
package com.example.abstractFactoryPattern;
/**
* Created by zhangrui on 2018/4/20.
*/
/*
* @ClassName FactoryPatternDemo
*@Description TODO
*@Author zhangrui
*@Date 11:00 11:00
*@Version
* */
public abstract class AbstractFactory {
abstract Food creatFood(String... foodOrder);
abstract Packaging creatPackage(String... packageOrder);
}
创建继承了抽象工厂的具体工厂:
package com.example.abstractFactoryPattern;
/**
* Created by zhangrui on 2018/4/20.
*/
/*
* @ClassName FoodFactory
*@Description TODO
*@Author zhangrui
*@Date 15:25 15:25
*@Version
* */
public class FoodFactory extends AbstractFactory {
NoodleProductLine noodleProductLine = new NoodleProductLine();
DumplingProductLine dumplingProductLine = new DumplingProductLine();
@Override
Food creatFood(String... foodOrder) {
if (foodOrder==null){
return null;
}
String msg = "";
//对进货商的需求进行判断
//如果需要的是
for (int i = 0;i < foodOrder.length;i++ ){
if (foodOrder[i].equals("noodle")){
//调用面条生产线生产面条
noodleProductLine.creat();
// return noodleProductLine;
}else if (foodOrder[i].equals("dumpling")){
//调用饺子生产线生产饺子
dumplingProductLine.creat();
//return dumplingProductLine;
}else {
//工厂没有对应的生产线,那就没办法调用生产线生产食物,所以返回提示信息
System.out.println("订单中的食物"+foodOrder[i]+"我们厂没办法成产,找别家看看吧");
}
}
return null;
}
@Override
Packaging creatPackage(String... packageOrder) {
return null;
}
}
package com.example.abstractFactoryPattern;
/**
* Created by zhangrui on 2018/4/20.
*/
/*
* @ClassName PackageFactory
*@Description TODO
*@Author zhangrui
*@Date 15:26 15:26
*@Version
* */
public class PackageFactory extends AbstractFactory {
PaperProductLine paperProductLine = new PaperProductLine();
PlasticProductLine plasticProductLine = new PlasticProductLine();
@Override
Food creatFood(String... foodOrder) {
return null;
}
@Override
Packaging creatPackage(String... packageOrder) {
if (packageOrder==null){
return null;
}
//对进货商的需求进行判断
//如果需要的是
for (int i = 0;i < packageOrder.length;i++ ){
if (packageOrder[i].equalsIgnoreCase("paper")){
//调用纸包装生产线生产纸包装
paperProductLine.givePackage();
}else if (packageOrder[i].equalsIgnoreCase("plastic")){
//调用塑料包装生产线生产塑料包装
plasticProductLine.givePackage();
}else {
//工厂没有对应的生产线,那就没办法调用生产线生产包装,所以返回提示信息
System.out.println("订单中的包装"+packageOrder[i]+"我们厂没办法成产,找别家看看吧");;
}
}
return null;
}
}
创建工厂调度器:
package com.example.abstractFactoryPattern;
/**
* Created by zhangrui on 2018/4/20.
*/
/*
* @ClassName FactoryProducer
*@Description TODO
*@Author zhangrui
*@Date 15:40 15:40
*@Version
* */
public class FactoryProducer {
public static AbstractFactory getFactory(String... choice){
for (int i = 0;i< choice.length;i++){
if(choice[i].equalsIgnoreCase("food")){
return new FoodFactory();
} else if(choice[i].equalsIgnoreCase("package")){
return new PackageFactory();
}
}
return null;
}
}
创建程序入口,自定义需要的工厂类型以及产品:
package com.example.abstractFactoryPattern;
/**
* Created by zhangrui on 2018/4/20.
*/
/*
* @ClassName AbstractFactoryPatternDemo
*@Description TODO
*@Author zhangrui
*@Date 15:41 15:41
*@Version
* */
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
String[] orderA = {"food"};
String[] foodOrder = {"noodle","dumpling"};
//获取食品工厂
AbstractFactory abstractFactory = FactoryProducer.getFactory(orderA);
abstractFactory.creatFood(foodOrder);
String[] orderB = {"package"};
String[] packageOrder = {"paper","plastic"};
abstractFactory = FactoryProducer.getFactory(orderB);
abstractFactory.creatPackage(packageOrder);
}
}
以上就是本博文的全部代码,代码运行效果如下图所示:
所有的代码都推送到了博主的GitHub,有需要的小伙伴可以去下载查看,
点击此处即可跳转
注:本博文为博主记录所写,若有不对之处欢迎指正.
Over!