最近学习到设计模式,现总结个人学习工厂模式内容。
上一篇: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。
以上仅为个人学习,如果错误望指出,谢谢。