Java设计模式-工厂模式

最近学习到设计模式,现总结个人学习工厂模式内容。
上一篇:Java设计模式-模板模式

定义

工厂模式属于创建型模式,它提供了一种创建对象的方式,不在是我们自己创建对象,而是通过工厂的方式帮助我们创建对象,不对客户端暴露创建逻辑。

优缺点

优点

  • 一个调用者想创建一个对象,只要知道其名称就可以了。
  • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  • 屏蔽产品的具体实现,调用者只关心产品的接口。

缺点

  • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂
  • 用户需要知道工厂信息

实现

这里以生产汽车进行扩展,以五菱宏光和解放牌为例。
汽车代码
在这里插入图片描述

简单工厂

第一步:工厂生产汽车

import template.factory.car.Car;
import template.factory.car.JieFangCar;
import template.factory.car.WulingCar;

/**
 * 简单工厂
 * @author cc百川
 *	一个工厂做很多事,同时需要用户清楚的知道,
 *	每一个汽车的名称,明显不利扩展,而且新增汽车需要修改这个工厂。
 */
public class SimpleFactory {
	public Car getCar(String carName){
		if("JieFang".equals(carName)) {
			return new JieFangCar();
		} else if("Wuling".equals(carName)) {
			return new WulingCar();
		}
		return null;
	}
}

第二部:测试,这里作为客户需要知道每一个汽车的名称,但是不关心生产过程。

在这里插入图片描述

工厂方法

第一步:定义接口

/**
 * 工厂接口制定规则,各个厂商自己实现执制
 * 造逻辑,我们这里只关心结果是一辆车就好。
 * 后面有新的汽车厂商只需要实现接口,生产汽车即可
 * @author cc百川
 *
 */
public interface Factory {
	Car getCar();
}

第二部:厂商生产汽车

解放牌类
/**
 * 解放牌汽车厂生成汽车
 * @author cc百川
 */
public class JieFangFactory implements Factory{
	@Override
	public Car getCar() {
		System.out.println("我们是解放牌汽车生产厂,生产国产汽车");
		return new JieFangCar();
	}
}

五菱类
/**
 * 五菱宏光
 * @author cc百川
 */
public class WulingFactory implements Factory{
	@Override
	public Car getCar() {
		System.out.println("五菱之光秋名山之神车");
		return new WulingCar();
	}
}

第三步:测试,用户不需要知道汽车名称,但是需要知道汽车厂商。

在这里插入图片描述

抽象工厂

第一步:定义抽象方法

/**
 * 定义了抽象接口,注意工厂中生产的是关联
 * 产品,不然的话,就可以分开定义工厂了
 * @author cc百川
 */
public abstract class AbstrFactory {
	//这里假定口罩,汽车,公路是有联系的
	abstract Car createCar();//制造汽车
	abstract String createMask();//制造口罩
	abstract String createHighway();//执照公路
}

第二部:厂商实现相关方法

解放牌类
import template.factory.car.Car;
import template.factory.car.JieFangCar;

public class JieFangAbstrFactory extends AbstrFactory{
	@Override
	Car createCar() {
		return new JieFangCar();
	}
	@Override
	String createMask() {
		return "生产解放牌口罩";
	}
	@Override
	String createHighway() {
		return "改革开放的春风吹呀吹,解放牌修路中";
	}
}

五菱宏光类
import template.factory.car.Car;
import template.factory.car.WulingCar;

public class WulingFactory extends AbstrFactory {
	@Override
	Car createCar() {
		return new WulingCar();
	}
	@Override
	String createMask() {
		return "参与口罩生产之五菱牌口罩";
	}
	@Override
	String createHighway() {
		return "正在修秋名山公路中";
	}
}

第三步:测试,工厂统一处理内部关联很强的产品。但是扩展很麻烦,需要统一修改接口,并同时添加其他产品,每一个实现接口的类都需要修改。

在这里插入图片描述
日常生活中生产水的工厂,生产蔬菜的工厂等等,以及常见的spring的BeanFactory。


以上仅为个人学习,如果错误望指出,谢谢。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值