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

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

简单工厂模式


需求1:


看一个披萨的项目:要便于披萨种类的扩展,要便于维护

1)披萨的种类很多,比如GreekPizz 、 CheesePizz 等

2)披萨的制作有 prepare bake, cut, box

3)完成披萨店订购功能。


传统实现


1dc618a0ed9580ce8bfa6facb208c08f.png

Pizza 类

//将Pizza 类做成抽象
public abstract class Pizza {
  protected String name; //名字
  //准备原材料, 不同的披萨不一样,因此,我们做成抽象方法
  public abstract void prepare();
  public void bake() {
  System.out.println(name + " baking;");
  }
  public void cut() {
  System.out.println(name + " cutting;");
  }
  //打包
  public void box() {
  System.out.println(name + " boxing;");
  }
  public void setName(String name) {
  this.name = name;
  }
}

CheesePizza类


public class CheesePizza extends Pizza {
  @Override
  public void prepare() {
  // TODO Auto-generated method stub
  System.out.println(" 给制作奶酪披萨 准备原材料 ");
  }
}
GreekPizza
public class GreekPizza extends Pizza {
  @Override
  public void prepare() {
  // TODO Auto-generated method stub
  System.out.println(" 给希腊披萨 准备原材料 ");
  }
}

PepperPizza


public class PepperPizza extends Pizza {
  @Override
  public void prepare() {
  // TODO Auto-generated method stub
  System.out.println(" 给胡椒披萨准备原材料 ");
  }
}


OrderPizza 订购pizza


public class OrderPizza {
  // 构造器
  public OrderPizza() {
  Pizza pizza = null;
  String orderType; // 订购披萨的类型
  do {
    orderType = getType();
    if (orderType.equals("greek")) {
    pizza = new GreekPizza();
    pizza.setName(" 希腊披萨 ");
    } else if (orderType.equals("cheese")) {
    pizza = new CheesePizza();
    pizza.setName(" 奶酪披萨 ");
    } else if (orderType.equals("pepper")) {
    pizza = new PepperPizza();
    pizza.setName("胡椒披萨");
    } else {
    break;
    }
    //输出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 "";
  }
  }
}


测试类:PizzaStore


//相当于一个客户端,发出订购
public class PizzaStore {
  public static void main(String[] args) {
  new OrderPizza();  
  }
}


运行结果:

5d4c6812c8535adbb050f4ddf2e1bce8.png


优缺点:


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


简单工厂方式实现


基本介绍


1dc618a0ed9580ce8bfa6facb208c08f.png5d4c6812c8535adbb050f4ddf2e1bce8.png


类:

46a9d80a6e05e4e3b19d57a0ee70bcdf.png

其中: 这下面的4个类代码不变。

66ba272a0bfc97be54a5fa679e3d5482.png

SimpleFactory


//简单工厂类
public class SimpleFactory {
  //更加orderType 返回对应的Pizza 对象
  public Pizza createPizza(String orderType) {
  Pizza pizza = null;
  System.out.println("使用简单工厂模式");
  if (orderType.equals("greek")) {
    pizza = new GreekPizza();
    pizza.setName(" 希腊披萨 ");
  } else if (orderType.equals("cheese")) {
    pizza = new CheesePizza();
    pizza.setName(" 奶酪披萨 ");
  } else if (orderType.equals("pepper")) {
    pizza = new PepperPizza();
    pizza.setName("胡椒披萨");
  }
  return pizza;
  }
  //简单工厂模式 也叫 静态工厂模式 
  public static Pizza createPizza2(String orderType) {
  Pizza pizza = null;
  System.out.println("使用简单工厂模式2");
  if (orderType.equals("greek")) {
    pizza = new GreekPizza();
    pizza.setName(" 希腊披萨 ");
  } else if (orderType.equals("cheese")) {
    pizza = new CheesePizza();
    pizza.setName(" 奶酪披萨 ");
  } else if (orderType.equals("pepper")) {
    pizza = new PepperPizza();
    pizza.setName("胡椒披萨");
  }
  return pizza;
  }
}


OrderPizza


public class OrderPizza {
  // 构造器
//  public OrderPizza() {
//  Pizza pizza = null;
//  String orderType; // 订购披萨的类型
//  do {
//    orderType = getType();
//    if (orderType.equals("greek")) {
//    pizza = new GreekPizza();
//    pizza.setName(" 希腊披萨 ");
//    } else if (orderType.equals("cheese")) {
//    pizza = new CheesePizza();
//    pizza.setName(" 奶酪披萨 ");
//    } else if (orderType.equals("pepper")) {
//    pizza = new PepperPizza();
//    pizza.setName("胡椒披萨");
//    } else {
//    break;
//    }
//    //输出pizza 制作过程
//    pizza.prepare();
//    pizza.bake();
//    pizza.cut();
//    pizza.box();
//    
//  } while (true);
//  }
  //定义一个简单工厂对象
  SimpleFactory simpleFactory;
  Pizza pizza = null;
  //构造器
  public OrderPizza(SimpleFactory simpleFactory) {
  setFactory(simpleFactory);
  }
  public void setFactory(SimpleFactory simpleFactory) {
  String orderType = ""; //用户输入的
  this.simpleFactory = simpleFactory; //设置简单工厂对象
  do {
    orderType = getType(); 
    pizza = this.simpleFactory.createPizza(orderType);
    //输出pizza
    if(pizza != null) { //订购成功
    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 "";
  }
  }
}


OrderPizza2


public class OrderPizza2 {
  Pizza pizza = null;
  String orderType = "";
  // 构造器
  public OrderPizza2() {
  do {
    orderType = getType();
    pizza = SimpleFactory.createPizza2(orderType);
    // 输出pizza
    if (pizza != null) { // 订购成功
    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 OrderPizza(new SimpleFactory());
  //System.out.println("~~退出程序~~");  
  //new OrderPizza2();
  }
}


1dc618a0ed9580ce8bfa6facb208c08f.png


工厂方法模式


介绍


5d4c6812c8535adbb050f4ddf2e1bce8.png


需求2:


46a9d80a6e05e4e3b19d57a0ee70bcdf.png


实现


66ba272a0bfc97be54a5fa679e3d5482.png88b9988b40447cb37c7e3c492d49867f.png


BJCheesePizza


public class BJCheesePizza extends Pizza {
  @Override
  public void prepare() {
  // TODO Auto-generated method stub
  setName("北京的奶酪pizza");
  System.out.println(" 北京的奶酪pizza 准备原材料");
  }
}


BJPepperPizza


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


LDCheesePizza


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


相关文章
|
21天前
|
设计模式 开发者 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应用的整体质量。
52 1
|
3月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
42 1
|
3月前
|
设计模式 XML 数据格式
python之工厂设计模式
python之工厂设计模式
python之工厂设计模式
|
3月前
|
设计模式 测试技术
依赖注入与工厂设计模式的区别
【8月更文挑战第22天】
60 0
|
18天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。