抽象工厂模式AbstractFactoryPattern

首先说下什么是抽象工厂模式:
抽象工厂模式(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!

猜你喜欢

转载自blog.csdn.net/m0_37190495/article/details/80021394
今日推荐