实现抽象工厂模式
原创
©著作权归作者所有:来自51CTO博客作者学习微站的原创作品,请联系作者获取转载授权,否则将追究法律责任
抽象工厂模式
定义:是一种为访问类提供的一个创建一组相关或相互依赖对象的接口,访问类无须置顶所要的产品的具体类就能得到同族的不同等级的产品的模式结构。
举个例子,小明爱吃汉堡可乐,他可以选择肯德基,也可以选择麦当劳。他不用说我要吃肯德基的汉堡可乐,他只要去肯德基,下单说我要吃汉堡可乐,至于是什么牌子的,当他进入肯德基的那一刻,就相当于已经进入了一个工厂----肯德基。小明就是访问类,快餐店就是抽象工厂,肯德基和麦当劳是工厂实现类。汉堡、可乐是抽象产品族。肯德基生产具体产品肯德基的汉堡包和肯德基的可乐。麦当劳生产具体产品麦当劳的汉堡包和麦当劳的可乐。
/**
* @author samxie
* @version 1.0
* @date 2022/5/25 20:40
**/
public class TestAbstractFactory {
//当增加一个新的产品族时不需要修改源代码,满足开闭原则
//但是当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改
//肯德基 Kentucky 麦当劳 McDonald
public static void main(String[] args) {
//小明去了肯德基
eatBurgerAndCola(new KentuckyFactory());
//小明去了麦当劳
eatBurgerAndCola(new McDonaldFactory());
}
public static void eatBurgerAndCola(AbstractFactory factory) {
Burger burger = factory.getBurger();
burger.eat();
Cola cola = factory.getCola();
cola.drink();
}
}
//不管肯德基、麦当劳,他们本质上是快餐店,负责提供汉堡可乐
interface AbstractFactory {
Burger getBurger();
Cola getCola();
}
interface Burger {
//吃吧孩子
void eat();
}
interface Cola {
//喝吧
void drink();
}
//具体工厂类
//来这里吧,肯德基欢迎你
class KentuckyFactory implements AbstractFactory {
@Override
public Burger getBurger() {
return new KentuckyBurger();
}
@Override
public Cola getCola() {
return new KentuckyPepsiCola();
}
}
//具体工厂类
//麦当劳实惠哦,来吧
class McDonaldFactory implements AbstractFactory {
@Override
public Burger getBurger() {
return new McDonaldBurger();
}
@Override
public Cola getCola() {
return new McDonaldCokeCola();
}
}
//具体产品:是小明最终要吃肯德基这件事的最终实现类,那直接调用不行吗,非要抽象工厂模式?
//当只有四种产品的时候,显然可以直接main调用就可以输出,但是随着产品越来越多,方法越来越多
//当增加一个新的产品族时不需要修改源代码,满足开闭原则,
//但是当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改
class KentuckyBurger implements Burger {
@Override
public void eat() {
System.out.println("吃肯德基牌子高级汉堡包");
}
}
class KentuckyPepsiCola implements Cola {
@Override
public void drink() {
System.out.println("喝肯德基牌子百事可乐");
}
}
class McDonaldBurger implements Burger {
@Override
public void eat() {
System.out.println("吃麦当劳牌子辣椒汉堡");
}
}
class McDonaldCokeCola implements Cola {
@Override
public void drink() {
System.out.println("喝麦当劳牌子可口可乐!");
}
}
//优点:正是由于复杂的抽象关联关系使得在产品组管理很方便,肯德基干肯德基的活,麦当劳干麦当劳
//的活,分工明确,分类明细,管理方便
//缺点:代码多,扩展很费力,每次要修改很多类
//应用场景:待创建的对象是一系列相互关联或相互依赖的产品族。
结果: