设计模式(10) -- 工厂设计模式(简单工厂,工厂方法,抽象工厂模式)(下)

简介: 设计模式(10) -- 工厂设计模式(简单工厂,工厂方法,抽象工厂模式)(下)

LDPepperPizza


public class LDPepperPizza extends Pizza{
  @Override
  public void prepare() {
  // TODO Auto-generated method stub
  setName("伦敦的胡椒pizza");
  System.out.println(" 伦敦的胡椒pizza 准备原材料");
  }
}


OrderPizza


public abstract class OrderPizza {
  //定义一个抽象方法,createPizza , 让各个工厂子类自己实现
  abstract Pizza createPizza(String orderType);
  // 构造器
  public OrderPizza() {
  Pizza pizza = null;
  String orderType; // 订购披萨的类型
  do {
    orderType = getType();
    pizza = createPizza(orderType); //抽象方法,由工厂子类完成
    //输出pizza 制作过程
    pizza.prepare();
    pizza.bake();
    pizza.cut();
    pizza.box();
  } while (true);
  } 
  // 写一个方法,可以获取客户希望订购的披萨种类
  private String getType() {
  try {
    BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("input pizza 种类:");
    String str = strin.readLine();
    return str;
  } catch (IOException e) {
    e.printStackTrace();
    return "";
  }
  }
}


BJOrderPizza

public class BJOrderPizza extends OrderPizza {
  @Override
  Pizza createPizza(String orderType) {
  Pizza pizza = null;
  if(orderType.equals("cheese")) {
    pizza = new BJCheesePizza();
  } else if (orderType.equals("pepper")) {
    pizza = new BJPepperPizza();
  }
  // TODO Auto-generated method stub
  return pizza;
  }
}


LDOrderPizza


public class LDOrderPizza extends OrderPizza {
  @Override
  Pizza createPizza(String orderType) {
  Pizza pizza = null;
  if(orderType.equals("cheese")) {
    pizza = new LDCheesePizza();
  } else if (orderType.equals("pepper")) {
    pizza = new LDPepperPizza();
  }
  // TODO Auto-generated method stub
  return pizza;
  }
}

测试类 PizzaStore

public class PizzaStore {
  public static void main(String[] args) {
  String loc = "bj";
  if (loc.equals("bj")) {
    //创建北京口味的各种Pizza
    new BJOrderPizza();
  } else {
    //创建伦敦口味的各种Pizza
    new LDOrderPizza();
  }
  // TODO Auto-generated method stub
  }
}

1dc618a0ed9580ce8bfa6facb208c08f.png


抽象工厂模式


介绍


5d4c6812c8535adbb050f4ddf2e1bce8.png


需求


使用:抽象工厂模式来完成披萨项目(需求2)

46a9d80a6e05e4e3b19d57a0ee70bcdf.png

66ba272a0bfc97be54a5fa679e3d5482.png

AbsFactory


//一个抽象工厂模式的抽象层(接口)
public interface AbsFactory {
  //让下面的工厂子类来 具体实现
  public Pizza createPizza(String orderType);
}

BJFactory


//这是工厂子类
public class BJFactory implements AbsFactory {
  @Override
  public Pizza createPizza(String orderType) {
  System.out.println("~使用的是抽象工厂模式~");
  // TODO Auto-generated method stub
  Pizza pizza = null;
  if(orderType.equals("cheese")) {
    pizza = new BJCheesePizza();
  } else if (orderType.equals("pepper")){
    pizza = new BJPepperPizza();
  }
  return pizza;
  }
}


LDFactory


public class LDFactory implements AbsFactory {
  @Override
  public Pizza createPizza(String orderType) {
  System.out.println("~使用的是抽象工厂模式~");
  Pizza pizza = null;
  if (orderType.equals("cheese")) {
    pizza = new LDCheesePizza();
  } else if (orderType.equals("pepper")) {
    pizza = new LDPepperPizza();
  }
  return pizza;
  }
}

订购pizza类 OrderPizza


public class OrderPizza {
  AbsFactory factory;
  // 构造器
  public OrderPizza(AbsFactory factory) {
  setFactory(factory);
  }
  private void setFactory(AbsFactory factory) {
  Pizza pizza = null;
  String orderType = ""; // 用户输入
  this.factory = factory;
  do {
    orderType = getType();
    // factory 可能是北京的工厂子类,也可能是伦敦的工厂子类
    pizza = factory.createPizza(orderType);
    if (pizza != null) { // 订购ok
    pizza.prepare();
    pizza.bake();
    pizza.cut();
    pizza.box();
    } else {
    System.out.println("订购失败");
    break;
    }
  } while (true);
  }
  // 写一个方法,可以获取客户希望订购的披萨种类
  private String getType() {
  try {
    BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("input pizza 种类:");
    String str = strin.readLine();
    return str;
  } catch (IOException e) {
    e.printStackTrace();
    return "";
  }
  }
}
测试类 PizzaStore
public class PizzaStore {
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  //new OrderPizza(new BJFactory());
  new OrderPizza(new LDFactory());
  }


运行结果:

1dc618a0ed9580ce8bfa6facb208c08f.png


工厂模式在JDK Calendar应用的源码 分析


5d4c6812c8535adbb050f4ddf2e1bce8.png

46a9d80a6e05e4e3b19d57a0ee70bcdf.png

66ba272a0bfc97be54a5fa679e3d5482.png


工厂模式小结


1dc618a0ed9580ce8bfa6facb208c08f.png




相关文章
|
1天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
2月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
2月前
|
设计模式 Java
Java设计模式-抽象工厂模式(5)
Java设计模式-抽象工厂模式(5)
|
2月前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
|
3月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
47 1
|
3月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
37 1
|
3月前
|
设计模式 XML 数据格式
python之工厂设计模式
python之工厂设计模式
python之工厂设计模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
17天前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
16 3
|
2月前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式

热门文章

最新文章