04_抽象工厂模式

【抽象工厂模式自己想的思路】

假设一个村庄生产两种水果:苹果和芒果,某年由于滞销导致村里积累了大量苹果和芒果,为了利用起来这些水果,村里要建设两种工厂,分别是果汁加工厂和果干加工厂,在这两个加工厂中,果汁加工厂可以生产苹果汁和芒果汁,果干加工厂可以生产苹果干和芒果干,这里就涉及了我们的抽象工厂模式。

 

【抽象工厂模式例子】

package com.Higgin.AbstractFactory;

/**
 * 苹果接口/抽象类  
 */
interface Apple{
    public void getName();
    public void getColor();
}

/**
 * 苹果汁 
 */
class AppleJuice implements Apple{
    @Override
    public void getName() {
        System.out.println("我是苹果汁!");
    }
    @Override
    public void getColor() {
        System.out.println("苹果汁,红红的!");
    }
}
/**
 * 苹果干 
 */
class AppleDry implements Apple{
    @Override
    public void getName() {
        System.out.println("我是苹果干!");
    }
    @Override
    public void getColor() {
        System.out.println("苹果干,红红的!");
    }
}

/**
 * 芒果接口/抽象类 
 */
interface Mango{
    public void getName();
    public void getColor();
}
/**
 * 芒果汁 
 */
class MangoJuice implements Mango{
    @Override
    public void getName() {
        System.out.println("我是芒果汁!");
    }
    @Override
    public void getColor() {
        System.out.println("芒果汁,黄黄的!");
    }
}
/**
 * 芒果干 
 */
class MangoDry implements Mango{
    @Override
    public void getName() {
        System.out.println("我是芒果干!");
    }
    @Override
    public void getColor() {
        System.out.println("芒果干,黄黄的!");
    }
}

/**
 * 水果工厂 接口/抽象类 
 */
interface FruitFactory{
    public Apple createApple();
    public Mango createMango();
}

/**
 * 果汁工厂 
 */
class FruitJuiceFactory implements FruitFactory{
    @Override
    public Apple createApple() {
        return new AppleJuice();
    }
    @Override
    public Mango createMango() {
        return new MangoJuice();
    }
}
/**
 * 果干工厂 
 */
class FruitDryFactory implements FruitFactory{
    @Override
    public Apple createApple() {
        return new AppleDry();
    }
    @Override
    public Mango createMango() {
        return new MangoDry();
    }
}
/**
 * 客户端 
 */
public class TestAbstractFactory {
    public static void main(String[] args) {
        //果汁工厂
        FruitFactory fruitJuiceFactory=new FruitJuiceFactory();
        //由果汁工厂 创建 苹果汁
        Apple appleJuice =fruitJuiceFactory.createApple();
        appleJuice.getName();
        appleJuice.getColor();
        //由果汁工厂 创建 芒果汁
        Mango mangoJuice=fruitJuiceFactory.createMango();
        mangoJuice.getName();
        mangoJuice.getColor();
        
        //果干工厂
        FruitFactory fruitDrtFactory=new FruitDryFactory();
        //由 果干工厂 得到 芒果干
        Mango mangoDry=fruitDrtFactory.createMango();
        mangoDry.getName();
        mangoDry.getColor();
        //由 果干工厂得到 苹果干
        Apple appleDry=fruitDrtFactory.createApple();
        appleDry.getName();
        appleDry.getColor();
        
    }
}

【运行结果】

 

【抽象工厂模式的优点】

1.封装性,每个产品的实现类不是高层模块所需要关注的,它需要关注的是接口/抽象类,它不关心对象是如何创建出来的,只要知道工厂类是谁,就能创建出一个需要的对象。

2.产品族内的约束为非公开状态。

【抽象工厂模式的缺点】

扩展较为困难。主要是产品族扩展较为困难,产品等级扩展实际是非常容易的。比如,增加一个橙子产品,只要新增橙子接口和其实现类橙子汁、橙子干,再在FruitFactory中添加上创建橙子的方法。

posted @ 2016-12-20 20:38  HigginCui  阅读(240)  评论(0编辑  收藏  举报