5.抽象工厂模式

1.什么是抽象工厂模式?

提供一个接口,用于创建相关对象或依赖对象的家族,而不需要明确指定具体类。 通过依赖注入来降低耦合。
在这里插入图片描述

2.结合工厂模式的披萨实例来理解抽象工厂模式

2.1 具体设计

尽管上一节的工厂模式设计已经好像看着可以,但是,我们好像也能明显的发觉到对于具体的PizzaStore的编写,我们好像违反了一个原则: 不要依赖具体,要依赖抽象。

例如我们看一下NYPizzaStore,它里面好像依赖了具体的Pizza对象,现在看来它就依赖了两个,但是如果长期以这样的方式来做的话,不难发现我们会进入一个依赖噩梦。

package factoryPattern.third.store;
import factoryPattern.third.PizzaStore;
import factoryPattern.third.pizza.NYPizza1;
import factoryPattern.third.pizza.NYPizza2;
import factoryPattern.third.pizza.Pizza;

public class NYPizzaStore extends PizzaStore {
    @Override
    protected Pizza createPizza(String type) {
        Pizza pizza = null;
        if(type.equals("NY1")){
            pizza = new NYPizza1();
        }else if(type.equals("NY2")){
            pizza = new NYPizza2();
        }
        return pizza;
    }
}

如何解决这个问题? 本届的抽象工厂模式也许会给你一些启发。

抽象工厂模式:提供一个接口用于创建相关或依赖对象的家族,而不需要明确指定具体类。

那么我们该如何让PizzaStore从依赖噩梦中解脱呢?员工A在原有的基础上,进行思考后,设计出下面的结构:
在这里插入图片描述

首先,他将Pizza抽象化了,并且新建立一个PizzaFactory接口用来将具体的PizzaStory和具体的Pizza实例解耦。
从图中我们可以看到,面向用户的具体的NYPizzaStore是通过依赖抽象的方式来满足需求的。

2.2 具体实现

Pizza.java

package AbstractFactoryPattern.base;
import java.util.Arrays;

public abstract class Pizza {
    public String name;
 
    public abstract void prepare();

    protected void bake(){
        System.out.println("准备烘烤 25 分钟...");
    }

    protected void cut(){
        System.out.println("烘烤完成,进行切割");
    }

    protected void box(){
        System.out.println("切割完毕,进行装盒");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

PizzaFactory.java

package AbstractFactoryPattern.base;

public interface PizzaFactory {
    Pizza createPizza(String type);
}


PizzaStore.java
package AbstractFactoryPattern.base;
public abstract class PizzaStore {

    public Pizza orderPizza(String type){
        Pizza pizza = createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }

    /**
     * 工厂方法
     * @param type 披萨类型
     * @return pizza实例
     */
    protected abstract Pizza createPizza(String type);
}

CheesePizza.java

package AbstractFactoryPattern.pizza;
import AbstractFactoryPattern.base.Pizza;

/**
 * Cheese披萨定义类
 * 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
 */
public class CheesePizza extends Pizza {

    public CheesePizza(){
    }

    @Override
    public void prepare() {
        System.out.println("Preparing "+name);
    }

    @Override
    protected void bake(){
        System.out.println("Cheese烘烤方式:。。。,,,。。。");
    }
}

ClamPizza.java

package AbstractFactoryPattern.pizza;

import AbstractFactoryPattern.base.Pizza;

public class ClamPizza extends Pizza {
    public ClamPizza(){ }

    @Override
    public void prepare() {
        System.out.println("Preparing "+name);
    }
    @Override
    protected void bake(){
        System.out.println("ClamPizza烘烤方式------");
    }
}

NYPizzaFactory.java

package AbstractFactoryPattern.factory;
import AbstractFactoryPattern.base.Pizza;
import AbstractFactoryPattern.base.PizzaFactory;
import AbstractFactoryPattern.pizza.CheesePizza;
import AbstractFactoryPattern.pizza.ClamPizza;

/**
 * Pizza工厂
 */
public class NYPizzaFactory implements PizzaFactory {
    @Override
    public Pizza createPizza(String type) {
        Pizza pizza = null;
        if(type.equals("cheese")){
            pizza = new CheesePizza();
            pizza.setName("New York Style Cheese Pizza");
        }else if(type.equals("clam")){
            pizza = new ClamPizza();
            pizza.setName("New York Style Clam Pizza");
        }
        return pizza;
    }
}

NYPizzaStore.java

package AbstractFactoryPattern.pizzaStore;

import AbstractFactoryPattern.base.Pizza;
import AbstractFactoryPattern.base.PizzaFactory;
import AbstractFactoryPattern.base.PizzaStore;
import AbstractFactoryPattern.factory.NYPizzaFactory;


/**
 * NY披萨工厂
 */
public class NYPizzaStore extends PizzaStore {

    PizzaFactory pizzaFactory;

    public NYPizzaStore(){
        this.pizzaFactory = new NYPizzaFactory();
    }

    public NYPizzaStore(PizzaFactory pizzaFactory){
        this.pizzaFactory = pizzaFactory;
    }
    @Override
    protected Pizza createPizza(String type) {
        return pizzaFactory.createPizza(type);
    }
}

OK,构建完毕,下面进行测试一下:

package AbstractFactoryPattern;

import AbstractFactoryPattern.base.PizzaStore;
import AbstractFactoryPattern.pizzaStore.NYPizzaStore;

/**
 * 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。 这种方式依赖注入
 */
public class MainTest {
    public static void main(String[] args) {
        PizzaStore nyPizzaStore = new NYPizzaStore();
        nyPizzaStore.orderPizza("cheese");
    }
}

在这里插入图片描述
完成!! 如果你成功重现出了上面的例子并理解了这种方式,可以将它和上一节的例子进行对比。

代码仓库地址如下:
https://gitee.com/yan-jiadou/design-mode/tree/master/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/src/main/java/AbstractFactoryPattern

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧课程内容和目标本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小牧之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值