Java设计模式——创建型模式之工厂模式

作为程序员菜鸟的板凳君,决定开始打牢固Java基础,那么就先从开始从设计模式开刀吧!

1、前言

     首先我们应该知道我们为什么要学习设计模式,板凳君就先谈谈自己的看法吧!其实设计模式说通俗一点就是我们的无数的前辈们总结的一套案例或者说是模板。因为在开发中,我们会经常遇到很多相同地场景,这个时候,我们的前辈们就把处理这种相似场景的思路或者说解决办法总结成一套模板,让后辈们在遇到相似场景的时候直接套用这种模板就行啦!

    所以学习这种设计模式我们更多的是要学习这些设计思想,因为的确是非常经典,这可能会对以后 自己的编码风格有一定的影响。

 

2、 工厂模式

 工厂模式应该算是这些设计模式中我们比较早了解的模式,它经常出现在各种配置文件中、或者我们自己地某些代码中。

我对于工厂模式的理解就是一种面向过程的编码的体现,因为开发者在创建一个对象的时候,不再需要自己去创建一个对象,而是将这种职能赋予给工厂,调用者只需要调用工厂的创建方法就可以得到自己想要的对象。而工厂对象又完美的体现了java设计原则中的单一职责,工厂的职责就仅仅是为了创建对象。其次就是,工厂的存在封装了类的创建,使调用者无法观察到对象的创建过程,而只需要关心创建对象是所需要的条件即可。

    但是这种简单的工厂模式,我们在开发中会很少或者几乎看不到,因为它的扩展性并不好,因为当一个工厂需要扩展产品的时候,原先的工厂类已经无法满足需求,需要改动源码,违背了开闭原则。不过从简单的工厂模式学起,我们也能从中学习到一些东西,毕竟在学习这种模式的时候我们的思想就已经在进步了,不是吗?好了,下面就来上代码举例子吧!

3、代码

3.1 这是一个制造汽车的工厂类、但是从代码中我们可以看到汽车的创建只有两种品牌的,当我们想要扩展产品时,这个类是肯定不合适的。

 

public class CarFactory {
private Car car;
public Car CreateCar(String carColour, String type)
{   
	try {
		if("BMW".equals(type))
		{
			this.car = new BMW(carColour, type);
			
		}
		else if("Benz".equals(type))
		{
			this.car = new BenzCar(carColour, type);
		}
		else
		{
			throw new Exception("have no this type Car"); 
		}
		
		this.car.getMessage();
		this.car.creatTime();
	} catch (Exception e) {
		// TODO: handle exception
		System.out.println(e);
	}
	
	return this.car;
}
}

3.2 车的抽象类

public abstract class Car {
private String carColour;
private String type;
public Car(String carColour, String type) {
	super();
	this.carColour = carColour;
	this.type = type;
}
public void getMessage()
{
	System.out.println("创建了类型为"+this.type+"颜色为"+this.carColour+"的车");
}
public abstract void creatTime();
}

3.3 具体的车

public class BMW extends Car{

	public BMW(String carColour, String type) {
		super(carColour, type);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void creatTime() {
		// TODO Auto-generated method stub
		System.out.println(new Date());
	}

}

public class BenzCar extends Car{

	public BenzCar(String carColour, String type) {
		super(carColour, type);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void creatTime() {
		// TODO Auto-generated method stub
		System.out.println(new Date());
	}

}

3.4 最后的测试,从测试中我们都可以看到,调用者只需要面向工厂即可

public class Test {
public static void main(String[] args) {
	/**
	 * 创建工厂模式的优点:
	 * 1、将创建的职责交给了工厂类,调用者只需要提供描述信息
	 * 2、无需在外部大量得了new 对象,是代码更加简单明了
	 * 3、体现了面向对象的一种思想,调用者无需再自己创建,只需要面对创建车的工厂即可
	 * 
	 * 缺点:
	 * 1、简单工厂无法真正做到代码的开闭原则,因为简单工厂创建的产品只能满足当前客户,代码的扩展性并不是很好
	 * 2、后期如果工厂要扩充产品的话,那么必须修改源码
	 * 3、只能适合用于创建不易变更的对象。
	 */
	CarFactory factory =new CarFactory();
	factory.CreateCar("红色", "BMW");
	factory.CreateCar("红色", "Benz");
	factory.CreateCar("红色", "biyadi");
}
}

3.5 运行结果

创建了类型为BMW颜色为红色的车
Sun Nov 11 20:20:28 CST 2018
创建了类型为Benz颜色为红色的车
Sun Nov 11 20:20:28 CST 2018
java.lang.Exception: have no this type Car

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值