Java工厂模式 工厂方法模式 抽象工厂

工厂模式

定义车的抽象类,有一个行驶的方法,所有的车都继承这个类

/**
 * Car 抽象类
 */
public abstract class Car {
	public abstract void run();
}


定义两辆车,奔驰和本田,继承Car 抽象类并实现run()方法

public class BenChi extends Car {

	@Override
	public void run() {
		System.out.println("开着奔驰去泡妞...");
	}
}

 

public class BenTian extends Car {

	@Override
	public void run() {
		System.out.println("开着本田去上班...");
	}
}

创建工厂类,负责生成汽车,如果想创建汽车就使用这个类,不用自己去new了

/**
 * Car的工厂类,负责生成各种汽车
 */
public class CarFactory {
	public static Car createCar(String type){
		if("奔驰".equals(type)){
			return new BenChi();
		}else if("本田".equals(type)){
			return new BenTian();
		}
		return null;
	}
}


测试类,想创建BenChi类时,无需 Car 奔驰 = new BenChi() ;  因为创建的过程交给了CarFactory类

public class Test {

	public static void main(String[] args) {
		Car 奔驰 = CarFactory.createCar("奔驰");
		奔驰.run();
		
		Car 本田 = CarFactory.createCar("本田");
		本田.run();
	}
}

执行输出

开着奔驰去泡妞...
开着本田去上班...


这就是一个工厂模式,但是有一个问题,我想增加一辆QQ车时要修改CarFactory类,这样不太好吧,写好的代码不应该经常修改,所以可以使用工厂方法模式。


工厂方法模式

定义生成车的接口

public interface CarFactory {
	public Car createCar();
}

创建生成XX车的工厂类,并实现CarFactory接口

/**
 * 生成奔驰的工厂类
 */
public class BenChiFactory implements CarFactory {

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


 

/**
 * 生成本田的工厂类
 */
public class BenTianFactory implements CarFactory{

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

}


 

/**
 * 生成QQ的工厂类
 */
public class QQFactory implements CarFactory{

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

}


定义车的抽象类,有一个行驶的方法,所有的车都继承这个类

/**
 * Car 抽象类
 */
public abstract class Car {
	public abstract void run();
}

创建辆车,奔驰,本田,QQ,继承Car 抽象类并实现run()方法

public class BenChi extends Car {

	@Override
	public void run() {
		System.out.println("开着奔驰去泡妞...");
	}
}

 

public class BenTian extends Car {

	@Override
	public void run() {
		System.out.println("开着本田去上班...");
	}
}


 

public class QQ extends Car{

	@Override
	public void run() {
		System.out.println("开着QQ送快递...");
	}
}


测试类

public class Test {

	public static void main(String[] args) {
		
		CarFactory 奔驰工厂 = new BenChiFactory();
		Car 奔驰 = 奔驰工厂.createCar();
		奔驰.run();
		
		CarFactory 本田工厂 = new BenTianFactory();
		Car 本田 = 本田工厂.createCar();
		本田.run();
		
		CarFactory  QQ工厂= new QQFactory();
		Car qq = QQ工厂.createCar();
		qq.run(); 
	}
}

结果

开着奔驰去泡妞...
开着本田去上班...
开着QQ送快递...


 

以后再新加车时,不需要修改以前写好的代码,只需要新建XXFactory实现CarFactory接口,和创建XX车类继承Car重写run()方法,这样就避免了修改以前的代码可能导致其他问题的发生

 

抽象工厂

定义抽象工厂接口AbstractFactory有两个方法

public interface AbstractFactory {
	public Car createCar();
	public Mobile createMobile();
}

定义手机和汽车的抽象类

public abstract class Mobile {
	public abstract void call();
}

 

public abstract class Car {
	public abstract void run();
}


建一个生产高帅富的工厂类并实现AbstractFactory接口,这个工厂将生产奔驰车和苹果手机

/**
 * 高帅富工厂
 */
public class GaoShuaiFuFactory implements AbstractFactory{

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

	@Override
	public Mobile createMobile() {
		return new Iphone();
	}

}


创建苹果手机类Iphone继承Mobile类,重写call()方法

public class Iphone extends Mobile{

	@Override
	public void call() {
		System.out.println("用苹果手机打电话");
	}
}

创建奔驰类继承Car类,重写run()方法

public class BenChi extends Car {

	@Override
	public void run() {
		System.out.println("开着奔驰去泡妞...");
	}
}


测试类

public class Test {

	public static void main(String[] args) {
		AbstractFactory abstractFactory = new GaoShuaiFuFactory();
		
		Car car = abstractFactory.createCar();
		car.run();
		Mobile mobile = abstractFactory.createMobile();
		mobile.call();
		
	}

}


执行控制台输出

开着奔驰去泡妞...
用苹果手机打电话


接下来我们把高帅富换成屌丝,屌丝开QQ,用小米手机

/**
 * 屌丝工厂
 */
public class DiaoSiFactory implements AbstractFactory{

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

	@Override
	public Mobile createMobile() {
		return new XiaoMi();
	}
	
}


创建小米手机类XiaoMi继承Mobile类,重写call()方法

public class XiaoMi extends Mobile{
	@Override
	public void call() {
		System.out.println("用小米手机打电话");
	}
}


创建QQ类继承Car类,重写run()方法

public class QQ extends Car{

	@Override
	public void run() {
		System.out.println("开着QQ送快递...");
	}
}


测试类,只需要将GaoShuaiFuFactory类换成DiaoSiFactory类就行了,如果使用spring的getbean形式,代码是不需要改的

public class Test {

	public static void main(String[] args) {
//		AbstractFactory abstractFactory = new GaoShuaiFuFactory();
		AbstractFactory abstractFactory = new DiaoSiFactory();
		
		Car car = abstractFactory.createCar();
		car.run();
		Mobile mobile = abstractFactory.createMobile();
		mobile.call();
		
	}

}


控制台输出

开着QQ送快递...
用小米手机打电话


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章