入门案例:在饮料工厂制作各种饮料,可以分析为消费者购买饮料只需要给饮料的名字就可以,工厂负责根据不同的饮品名称生产不同的饮料给消费者消费即可,消费者不需要去知道饮料制作的流程和配料配比等一系列的内在实现,这些统统可以交给工厂来完成;
我们首先定义一个制作饮料的规范:
/**
* 制作饮料标准接口
*/
public interface Drink {
void makeDrink();
}
定义制作两种饮料,可乐和雪碧
public class PepsiDrink implements Drink {
public PepsiDrink() {
this.makeDrink();
}
@Override
public void makeDrink() {
System.out.println("制作百事可乐!");
}
}
public class SpriteDrink implements Drink {
public SpriteDrink() {
this.makeDrink();
}
@Override
public void makeDrink() {
System.out.println("制作雪碧~");
}
}
定义制作工厂,制作饮料
public class DrinkFactory {
public Drink makeDrink(String type){
Drink drink = null;
if("百事".equals(type)){
drink = new PepsiDrink();
}else if ("雪碧".equals(type)){
drink = new SpriteDrink();
}
else {
System.out.println((type + "饮料已售空!"));
}
return drink;
}
private static class DrinkFactoryHolder{
private static final DrinkFactory INSTANCE = new DrinkFactory();
}
public static DrinkFactory getInstance(){
return DrinkFactoryHolder.INSTANCE;
}
}
设置消费者顾客来工厂拿饮料:
/**
* 模拟消费者消费
*/
public class Main {
public static void main(String[] args) {
DrinkFactory factory = DrinkFactory.getInstance();
factory.makeDrink("百事");
factory.makeDrink("雪碧");
factory.makeDrink("可口可乐");
}
}
输出:
简单工厂模式相对简单!
相比较于简单工厂设计模式,违反了开闭原则:也就是软件实体应该对扩展开放,对修改关闭;【假如新增一种饮品,我们就需要修改工厂的代码】。
工厂方法模式就完美解决了这种原则,类图如下:
这个时候我们新增饮料,只需要做扩展就行,不需要去修改原有的代码
工厂类接口:
public interface DrinkFactory {
Drink makeDrink();
}
雪碧的工厂实现类:
public class SpriteFactory implements DrinkFactory {
@Override
public Drink makeDrink() {
return SpriteDrink.getInstance();
}
private static class SpriteFactoryHolder{
private static final SpriteFactory INSTANCE = new SpriteFactory();
}
public static SpriteFactory getInstance(){
return SpriteFactoryHolder.INSTANCE;
}
}
百事的工厂实现类:
public class PepsiFactory implements DrinkFactory{
@Override
public Drink makeDrink() {
return PepsiDrink.getInstance();
}
private static class PepsiFactoryHolder{
private static final PepsiFactory INSTANCE = new PepsiFactory();
}
public static PepsiFactory getInstance(){
return PepsiFactoryHolder.INSTANCE;
}
}
模拟消费者来拿货:
/**
* 模拟消费者消费
*/
public class Main {
public static void main(String[] args) {
SpriteFactory.getInstance().makeDrink();
PepsiFactory.getInstance().makeDrink();
}
}
以上我们就是看到了工厂方法模式的代码量相比较于简单工厂模式要多了很多,但是遵守了面向对象设计模式的开闭原则!
当然需求会发生变化,类似我们现在只能满足生产饮料,工厂需要扩展业务还需要生产面包,这个就无法满足这种不同类型的产品扩展了。所以我们可以开始做一种抽象的工厂来生产多种不同类型东西。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjRZrUYh-1624183394855)(C:\Users\39637\AppData\Local\Temp\1624183091404.png)]
介绍了三种工厂模式,当然第一种使用的较多,因为简单,后面两种根据实际情况去决定使用哪种!
在工厂模式中可以使用前面说到的单例模式还有策略模式都是可以融汇贯通使用,并无明文的规定那种较好,符合实际需求的设计模式才是最好的!
介绍了三种工厂模式,当然第一种使用的较多,因为简单,后面两种根据实际情况去决定使用哪种!
在工厂模式中可以使用前面说到的单例模式还有策略模式都是可以融汇贯通使用,并无明文的规定那种较好,符合实际需求的设计模式才是最好的!