1、简单/静态工厂模式概述
- 简单工厂模式使属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
- 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
- 在软件开发中,当我们会用到大量的创建某种,某类或者某批对象时,就会使用到工厂模式
- 定义一个简单工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常是具有共同的父亲
- 在简单工厂模式中,创建实例的方法通常为静态方法,因此简单工厂模式又被称为静态工厂模式
2、简单工厂模式的优点:
- 工厂类包含了必要的逻辑判断,可以决定在什么情况下创建哪个类的实例,客户端可以免除直接创建产品对象的职责
- 客户端无需知道所创建的产品的类名,只需知道参数即可。
- 也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类
3、缺点
- 工厂类集中了所有的产品创建逻辑,职责过重,一旦异常,整个系统受到影响
- 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
- 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
- 简单工厂模式使用了static工厂方法,造成工厂角色无法形成基于继承的等级结构。
4、简单工厂模式的使用场景:
- 工厂类负责创建对的对象比较少,因为不会造成工厂方法中的业务逻辑过于复杂
- 客户端只知道传入工厂类的参数,对如何创建对象不关心
5、代码实现
class Demo{public static void main(String[] args) {//调用工厂里的静态方法 创建对象Pizza hj = PizzaFactory.getPizza("胡椒");hj.getReady();}}public abstract class Pizza {//父类中的抽象方法public abstract void getReady();}class APizza extends Pizza{@Overridepublic void getReady() {System.out.println("胡椒披萨正在制作");}}class BPizza extends Pizza{@Overridepublic void getReady() {System.out.println("番茄披萨正在制作");}}//Pizza工厂类class PizzaFactory{//静态方法 ,根据传入的值进行判断创建对象public static Pizza getPizza(String name){Pizza pizza = null;if ("胡椒".equals(name)){pizza = new APizza();}else if("番茄".equals(name)){pizza = new BPizza();}return pizza;}}
6、简单工厂练习题
使用简单工厂模式设计一个可以创建不同几何图形(Shape),如Circle,Rectangle,Triangle等绘图工具类,每个几何图形均具有绘制Draw()和擦除Erase()两个方法
package com.yixuexi;import java.util.Scanner;/*** 2020/10/15 22:06*/public class ShapeDemo {public static void main(String[] args) {boolean loop = true;while (loop){System.out.println("请输入要打印的图形:");Scanner scanner = new Scanner(System.in);String next = scanner.next();switch (next){case "正方形":Shape shape1 = ShapeFactory.getShape(next);shape1.draw();shape1.erase();break;case "圆形":Shape shape2 = ShapeFactory.getShape(next);shape2.draw();shape2.erase();break;case "三角形":Shape shape3 = ShapeFactory.getShape(next);shape3.draw();shape3.erase();break;default:System.out.println("没有该图形");loop = false;}}}}interface Shape{void draw();void erase();}//圆形class Circle implements Shape{@Overridepublic void draw() {System.out.println("正在画圆形");}@Overridepublic void erase() {System.out.println("正在擦除圆形");}}//正方形class Rectangle implements Shape{@Overridepublic void draw() {System.out.println("正在画正方形");}@Overridepublic void erase() {System.out.println("正在擦除正方形");}}//三角形class Triangle implements Shape{@Overridepublic void draw() {System.out.println("正在画三角形");}@Overridepublic void erase() {System.out.println("正在擦除三角形");}}// 简单图形工厂class ShapeFactory{public static Shape getShape(String type){Shape shape = null;if ("三角形".equals(type)){shape = new Triangle();}else if("正方形".equals(type)){shape = new Rectangle();}else if("圆形".equals(type)){shape = new Circle();}return shape;}}
