抽象工厂模式

案例

工厂方法模式 的案例基础上,为农夫山泉、咖啡增加了常温、加热两种状态。

/*
 1. 抽象产品接口(水)
 */
public interface Water {

    public void getWaterType();
    public void getWaterTemperature();
}
/*
 * 抽象的产品类(咖啡)
 */
public abstract class AbstractCoffee implements Water{

    public void getWaterType(){
        System.out.println("这是一杯咖啡");
    }
}
/*
 * 抽象的产品类(农夫山泉)
 */
public abstract class AbstractNongFuSpring implements Water{

    public void getWaterType(){
        System.out.println("这是一瓶农夫山泉");
    }
}
/*
 * 具体产品类:热的咖啡
 */
public class HotCoffee extends AbstractCoffee{

    @Override
    public void getWaterTemperature() {
        System.out.println("咖啡是热的……");
    }
}
/*
 * 具体产品类:热的农夫山泉
 */
public class HotNongFuSpring extends AbstractNongFuSpring{

    @Override
    public void getWaterTemperature() {
        System.out.println("农夫山泉是热的……");
    }
}
/*
 * 具体产品类:常温的咖啡
 */
public class NormalCoffee extends AbstractCoffee{

    @Override
    public void getWaterTemperature() {
        System.out.println("咖啡是常温的");
    }

}
/*
 * 具体产品类:常温的农夫山泉
 */
public class NormalNongFuSpring extends AbstractNongFuSpring{

    @Override
    public void getWaterTemperature() {
        System.out.println("农夫山泉是常温的");
    }
}
/*
 * 抽象工厂接口
 */
public interface Creator {

    public Water createCoffee();
    public Water createNongFuSpring();
}
/*
 * 具体工厂类(热饮)
 */
public class HotCreator implements Creator{

    @Override
    public Water createCoffee() {
        return new HotCoffee();
    }

    @Override
    public Water createNongFuSpring() {
        return new HotNongFuSpring();
    }
}
/*
 * 具体工厂类(常温饮品)
 */
public class NormalCreator implements Creator{

    @Override
    public Water createCoffee() {
        return new NormalCoffee();
    }

    @Override
    public Water createNongFuSpring() {
        return new NormalNongFuSpring();
    }
}
/*
 * 使用场景
 */
public class Scene {

    public static void main(String[] args) {

        Creator hotCreator = new HotCreator();
        Creator normalCreator = new NormalCreator();
        //生产一杯热的咖啡
        Water coffee = hotCreator.createCoffee();
        coffee.getWaterType();
        coffee.getWaterTemperature();
        //生产一瓶热的农夫山泉
        Water nongFuSpring = hotCreator.createNongFuSpring();
        nongFuSpring.getWaterType();
        nongFuSpring.getWaterTemperature();
    }
}

优点

  • 封装性良好
  • 产品族内的约束为非公开状态。如:在饮品的产量上,常温饮品的产量与热饮的产量之间有一个约束(2:1)存在,这样的生产过程对调用工厂类的高层模块而言是透明的,因为其具体的实现过程是在工厂内完成的

缺点

  • 产品族的扩展会比较困难。如:增加一个产品(可口可乐),会牵涉到哪些类的改动?

使用场景

  • 一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。如:一个文本编辑器和一个图片处理器,都是软件实体,但是Unix 下的文本编辑器和 Windows 下的文本编辑器虽然功能和界面都相同,但是代码实现是不同的,图片处理器也有类似情况。也就是具有了共同的约束条件:操作系统类型。于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值