java设计模式--工厂模式

本文通过具体案例介绍了工厂模式的两种实现方式:静态工厂模式和多个工厂模式。详细展示了如何使用Java实现车辆制造过程,并讨论了这两种模式的特点及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.工厂模式的定义

        工厂模式使用的频率非常高,我们在开发中总能见到它们的身影。其定义为:Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.即定义一个用于创建对象的接口,让子类决定实例化哪一个类。

2 静态工厂模式

    案列:

         造车
         比亚迪汽车
         型号:秦 唐 宋
        想要什么型号告诉工厂,工厂直接就给你造什么样型号的车
    UML:

代码:

/**
 * 车
 * @author pengkun
 *
 */
public interface Car {
	void getCar();
}

/**
 * 秦
 * @author pengkun
 *
 */
public class QinCar implements Car {

	@Override
	public void getCar() {
		System.out.println("制造了一辆比亚迪秦");
	}

}

/**
 * 宋
 * @author pengkun
 *
 */
public class SongCar implements Car {

	@Override
	public void getCar() {
		System.out.println("制造了一辆比亚迪宋");
	}

}

/**
 * 唐
 * @author pengkun
 *
 */
public class TangCar implements Car {

	@Override
	public void getCar() {
		System.out.println("制造了一辆比亚迪唐");
	}

}

工厂:这里用的反射

/**
 * 车厂
 * @author pengkun
 *
 */
public interface CarFactory {
	//造车
	<T extends Car>T createCar(Class<T> clazz);
}

/**
 * byd造车厂
 * @author pengkun
 *
 */
public class BYDFactory implements CarFactory {

	@SuppressWarnings("unchecked")
	@Override
	public <T extends Car> T createCar(Class<T> clazz) {
		Car car=null;
		try {
			 car=(Car) Class.forName(clazz.getName()).newInstance();
		}catch (Exception e) {
			System.out.println("造车失败...");
		}
		return (T)car;
	}

}

测试:

	@Test
	public void test() {
		CarFactory factory=new BYDFactory();
		Car carQ=factory.createCar(QinCar.class);
		Car carT=factory.createCar(TangCar.class);
		carQ.getCar();
		carT.getCar();
	}

结果:

制造了一辆比亚迪秦
制造了一辆比亚迪唐

总结:这就是静态工厂模式,在实际项目中,根据需求可以设置成静态工厂类,但是缺点是扩展比较困难,如果就一个工厂,不需要扩展,可以这么设计,仍然是很常用的。

仔细想想三个型号的车都只有工厂制造,那工厂压力太大,就多弄几个工厂一个工厂造一种型号吧

多个工厂模式


UML:


代码:

其他都不变工厂改一改

/**
 * 车厂
 * @author pengkun
 *
 */
public interface CarFactory2 {
	//造车
	Car createCar();
}

/**
 * 秦工厂
 * @author pengkun
 *
 */
public class QinFactory implements CarFactory2 {

	@Override
	public Car createCar() {
		return new QinCar();
	}

}

//后面都一样同理就省略了。。

测试:

	@Test
	public void test2() {
		Car carQ=new QinFactory().createCar();
		Car carT=new TangFactory().createCar();
		carQ.getCar();
		carT.getCar();
	}

结果

制造了一辆比亚迪秦
制造了一辆比亚迪唐
总结:这种工厂模式的好处是职责清晰,结构简单,但是给扩展性和可维护性带来了一定的影响,因为如果要扩展一个产品类,就需要建立一个相应的工厂类,这样就增加了扩展的难度。因为工厂类和产品类的数量是相同的,维护时也需要考虑两个对象之间的关系。但是这种模式还是很常用的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值