常用设计模式——简单工厂模式

个人整合学习自

  1. 设计模式(菜鸟教程)
  2. youlookwhat大佬的GitHub仓库

工厂模式

在youlookwhat大佬的Github博客提到工厂模式有好几种

  1. 静态工厂模式:也就是常用的XxxUtil.method() 这种公共类的静态方法,比较简单。
  2. 简单工厂模式:通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。就是店内直接创建肉夹馍来卖。
  3. 工厂方法模式,将工厂类分为抽象接口和工厂实现,更满足开闭原则。
  4. 抽象工厂模式
/**
 * 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;
    }
}
  1. 工厂方法模式,也就是这个菜鸟教程里面的工厂模式
  2. 抽象工厂模式,下次交代。

简单工厂模式的一个案例实现

我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。

FactoryPatternDemo,我们的演示类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。
在这里插入图片描述
在这里插入图片描述

  1. 创建一个接口,这里用图形做例子
package xyz.cglzwz.question_bank.factorypattern;

public interface Shape {
	void draw();
}
  1. 创建实现接口的实体类。有矩形、正方形、圆形
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("圆形");
	}
}
  1. 创建一个工厂,生成基于给定信息的实体类的对象。
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;
		}
	}
}
  1. 使用该工厂,通过传递类型信息来获取实体类的对象。
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();
	}
}
  1. 结果输出
圆形
矩形
正方形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值