个人整合学习自
工厂模式
在youlookwhat大佬的Github博客提到工厂模式有好几种
- 静态工厂模式:也就是常用的XxxUtil.method() 这种公共类的静态方法,比较简单。
- 简单工厂模式:通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。就是店内直接创建肉夹馍来卖。
- 工厂方法模式,将工厂类分为抽象接口和工厂实现,更满足开闭原则。
- 抽象工厂模式
/**
* Created by jingbin on 2016/10/23.
* 西安 简单工厂模式:
* 用来西安店生产自己店里的肉夹馍
*/
public class XianSimpleRoujiaMoFactory {
public RoujiaMo creatRoujiaMo(String type) {
RoujiaMo roujiaMo = null;
switch (type) {
case "Suan":
roujiaMo = new XianSuanRoujiMo();
break;
case "La":
roujiaMo = new XianKuRoujiMo();
break;
case "Tian":
roujiaMo = new XianlaRoujiMo();
break;
default:// 默认为酸肉夹馍
roujiaMo = new XianSuanRoujiMo();
break;
}
return roujiaMo;
}
}
- 工厂方法模式,也就是这个菜鸟教程里面的工厂模式
- 抽象工厂模式,下次交代。
简单工厂模式的一个案例实现
我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。
FactoryPatternDemo,我们的演示类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。
- 创建一个接口,这里用图形做例子
package xyz.cglzwz.question_bank.factorypattern;
public interface Shape {
void draw();
}
- 创建实现接口的实体类。有矩形、正方形、圆形
package xyz.cglzwz.question_bank.factorypattern;
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("矩形");
}
}
package xyz.cglzwz.question_bank.factorypattern;
public class Square implements Shape {
@Override
public void draw() {
System.out.println("正方形");
}
}
package xyz.cglzwz.question_bank.factorypattern;
public class Cicle implements Shape {
@Override
public void draw() {
System.out.println("圆形");
}
}
- 创建一个工厂,生成基于给定信息的实体类的对象。
package xyz.cglzwz.question_bank.factorypattern;
/**
* 创建一个形状制作获取工厂
*
* @author chgl16
*
*/
public class ShapeFactory {
public Shape getShape(String shapeType) {
// 按照需求创建返回
switch (shapeType) {
case "rectangle" : return new Rectangle();
case "square" : return new Square();
case "cicle" : return new Cicle();
default: return null;
}
}
}
- 使用该工厂,通过传递类型信息来获取实体类的对象。
package xyz.cglzwz.question_bank.factorypattern;
public class App {
public static void main(String[] args) {
// 创建一个工厂实例
ShapeFactory shapeFactory = new ShapeFactory();
// 获取一个圆形,然后调用其一个方法 (以下都使用接口来声明引用,这样不用强制类型转换,而且松耦合)
Shape shape1 = shapeFactory.getShape("cicle");
shape1.draw();
// 获取一个矩形,然后调用其一个方法
Shape shape2 = shapeFactory.getShape("rectangle");
shape2.draw();
// 获取一个正方形,然后调用其一个方法
Shape shape3 = shapeFactory.getShape("square");
shape3.draw();
}
}
- 结果输出
圆形
矩形
正方形