设计模式之工厂模式

  工厂模式是一种常用的实例化对象的设计模式,它用工厂方法代替了实例化对象时的new操作。工厂模式主要分为三种,分别是简单工厂,工厂方法和抽象工厂。我们来一一介绍。

  假定工厂生产的产品需要一个统一的接口如下:

package 工厂模式;
/**
 * 统一的产品接口
 */
public interface Product {
	public String ProStandard();
}  

  1.简单工厂

  

package 工厂模式;
/**
 * 简单工厂
 * 		定义一个产品接口Product
 * 			然后定义实现Porduct接口的三个产品实现类,Washer,IceBox,AirCondithon
 * 		在SimpleFactory类里,直接生产相应的产品
 */
public class SimpleFactory {
	/**
	 * 根据传递的产品名称来生产产品
	 * @param productName
	 * @return
	 * @throws Exception
	 */
	static Product createProduct(String productName) throws Exception{
		if("Washer".equals(productName)){
			return new Washer();
		}else if("IceBox".equals(productName)){
			return new IceBox();
		}else if("AirCondition".equals(productName)){
			return new AirCondition();
		}else{
			throw new Exception("没有该产品!");
		}
		
	}
	/**
	 * 入口函数
	 * @param args
	 */
	public static void main(String[] args) {
		//生产三种产品
		try {
			createProduct("Washer");
			//如果输错产品名称,会导致无法生产
//			createProduct("Washer1");
			createProduct("IceBox");
			createProduct("AirCondition");
			//生产暂时没有的产品时,需要再创建相应的产品实现类,而且要多出修改
//			createProduct("Television");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

/**
 * 	洗衣机
 * @author Administrator
 *
 */
class Washer implements Product{
	/**
	 * 实例化时就生产洗衣机
	 */
	public Washer() {
		System.out.println(ProStandard()+"洗衣机生产了!");
	}

	@Override
	public String ProStandard() {
		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
	}
}
	
/**
 * 冰箱	
 */
class IceBox implements Product{
	/**
	 * 实例化时就生产冰箱
	 */
	public IceBox(){
		System.out.println(ProStandard()+"冰箱生产了!");
	}

	@Override
	public String ProStandard() {
		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
	}
}
/**
 * 空调
 */
class AirCondition implements Product{
	/**
	 * 实例化时就生产空调
	 */
	public AirCondition(){
		System.out.println(ProStandard()+"空调生产了!");
	}

	@Override
	public String ProStandard() {
		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
	}
}

  上述代码执行后,控制台打印如下:

==符合Washer产品标准---洗衣机生产了!
==符合IceBox产品标准---冰箱生产了!
==符合AirCondition产品标准---空调生产了!

  简单工厂存在高耦合的情况,如果产品的生产计划更改,需要在源代码中更改,不符合面向对象中的“向继承开放,向修改关闭”的原则。

  2.工厂方法

  

package 工厂模式;
/**
 * 定义一个统一的工厂接口
 */
public interface Factory {
	public String facStandard();
	//public Product createProduct();
}
---------------------------------------------------------
package 工厂模式;
	/**
	 * 工厂方法
	 * 		声明实现Factory接口的三个工厂类,分别生产洗衣机,冰箱,空调
	 * 		这些工厂实现类里均有生产产品的方法
	 */
public class FactoyMethod {
	//程序入口方法
	public static void main(String[] args) {
		new WasherFactory().createProduct();
		new IceBoxFactory().createProduct();
		new AirConditionFactory().createProduct();
	}
}

/**
 * 洗衣机厂
 */
class WasherFactory implements Factory{
	@Override
	public String facStandard() {
		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
	}

//	@Override
	public Product createProduct() {
		System.out.println(facStandard());
		return new Washer();
	}	
}

/**
 * 冰箱厂
 */
class IceBoxFactory implements Factory{

	@Override
	public String facStandard() {
		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
	}

//	@Override
	public Product createProduct() {
		System.out.println(facStandard());
		return new IceBox();
	}	
}

/**
 * 空调厂
 */
class AirConditionFactory implements Factory{

	@Override
	public String facStandard() {
		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
	}

//	@Override
	public Product createProduct() {
		System.out.println(facStandard());
		return new AirCondition();
	}	
}

  上述代码执行后,控制台打印如下:

***符合WasherFactory工厂标准---
==符合Washer产品标准---洗衣机生产了!
***符合IceBoxFactory工厂标准---
==符合IceBox产品标准---冰箱生产了!
***符合AirConditionFactory工厂标准---
==符合AirCondition产品标准---空调生产了!

  工厂方法可以通过某些专业的工厂来生产特定产品,在解耦合方面比简单工厂有很大的进步。但是,在面临更为复杂的生产形势,尤其是产品线更为庞大时,就要采用抽象工厂了。

  3.抽象工厂

  

package 工厂模式;
	/**
	 * 抽象工厂
	 * 		便于产品分类
	 */
public class AbstractFactory {
	public static void main(String[] args) {
		new WasherFactory_A_Depart().createProduct();
		new WasherFactory_B_Depart().createProduct();
		new IceBoxFactory_A_Depart().createProduct();
		new IceBoxFactory_B_Depart().createProduct();
		new AirConditionFactory_A_Depart().createProduct();
		new AirConditionFactory_B_Depart().createProduct();
	}
}

/**
 * 洗衣机产品
 */
abstract class WasherAbstract implements Product {
}
/**
 * 洗衣机产品A系列
 */
class Washer_A extends WasherAbstract{
	public Washer_A(){
		System.out.println(this.toString());
	}
	@Override
	public String ProStandard() {
		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
	}
	@Override
	public String toString() {
		return ProStandard()+this.getClass().getSimpleName()+"生产了!";
	}		
}
/**
 * 洗衣机产品B系列
 */
class Washer_B extends WasherAbstract{
	public Washer_B(){
		System.out.println(this.toString());
	}
	@Override
	public String ProStandard() {
		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
	}
	@Override
	public String toString() {
		return ProStandard()+this.getClass().getSimpleName()+"生产了!";
	}	
}

/**
 * 冰箱产品
 */
abstract class IceBoxAbstract implements Product{}
/**
 * 冰箱产品A系列
 */
class IceBox_A extends IceBoxAbstract{
	public IceBox_A(){
		System.out.println(this.toString());
	}
	@Override
	public String ProStandard() {
		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
	}
	@Override
	public String toString() {
		return ProStandard()+this.getClass().getSimpleName()+"生产了!";
	}	
}
/**
 * 冰箱产品B系列
 */
class IceBox_B extends IceBoxAbstract{
	public IceBox_B(){
		System.out.println(this.toString());
	}
	@Override
	public String ProStandard() {
		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
	}
	@Override
	public String toString() {
		return ProStandard()+this.getClass().getSimpleName()+"生产了!";
	}	
}

/**
 * 空调产品
 */
abstract class AirConditionAbstract implements Product{}
/**
 * 空调产品A系列
 */
class AirCondition_A extends AirConditionAbstract{
	public AirCondition_A(){
		System.out.println(this.toString());
	}
	@Override
	public String ProStandard() {
		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
	}
	@Override
	public String toString() {
		return ProStandard()+this.getClass().getSimpleName()+"生产了!";
	}	
}
/**
 * 空调产品B系列
 */
class AirCondition_B extends AirConditionAbstract{
	public AirCondition_B(){
		System.out.println(this.toString());
	}
	@Override
	public String ProStandard() {
		return "==符合"+this.getClass().getSimpleName()+"产品标准---";
	}
	@Override
	public String toString() {
		return ProStandard()+this.getClass().getSimpleName()+"生产了!";
	}	
}
/**
 * 洗衣机工厂
 * @author Administrator
 *
 */
abstract class WasherFactoryAbstract implements Factory{}
/**
 * 生产洗衣机产品A系列的车间
 */
class WasherFactory_A_Depart extends WasherFactoryAbstract{

	@Override
	public String facStandard() {
		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
	}

//	@Override
	public Product createProduct() {
		System.out.println(facStandard());
		return new Washer_A();
	}	
}
/**
 * 生产洗衣机产品B系列的车间
 */
class WasherFactory_B_Depart extends WasherFactoryAbstract{

	@Override
	public String facStandard() {
		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
	}

//	@Override
	public Product createProduct() {
		System.out.println(facStandard());
		return new Washer_B();
	}	
}
/**
 * 冰箱工厂
 */
abstract class IceBoxFactoryAbstract implements Factory{}
/**
 * 生产冰箱产品A系列的车间
 */
class IceBoxFactory_A_Depart extends IceBoxFactoryAbstract{

	@Override
	public String facStandard() {
		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
	}

//	@Override
	public Product createProduct() {
		System.out.println(facStandard());
		return new IceBox_A();
	}	
}
/**
 * 生产冰箱产品B系列的车间
 */
class IceBoxFactory_B_Depart extends IceBoxFactoryAbstract{

	@Override
	public String facStandard() {
		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
	}

//	@Override
	public Product createProduct() {
		System.out.println(facStandard());
		return new IceBox_B();
	}	
}
/**
 * 空调工厂
 */
abstract class AirConditionFactoryAbstract implements Factory{}
/**
 * 生产空调产品A系列的车间
 */
class AirConditionFactory_A_Depart extends AirConditionFactoryAbstract{

	@Override
	public String facStandard() {
		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
	}

//	@Override
	public Product createProduct() {
		System.out.println(facStandard());
		return new AirCondition_A();
	}	
}
/**
 * 生产空调产品B系列的车间
 */
class AirConditionFactory_B_Depart extends AirConditionFactoryAbstract{

	@Override
	public String facStandard() {
		return "***符合"+this.getClass().getSimpleName()+"工厂标准---";
	}

//	@Override
	public Product createProduct() {
		System.out.println(facStandard());
		return new AirCondition_B();
	}	
}

  上述代码执行后,控制台打印如下:

***符合WasherFactory_A_Depart工厂标准---
==符合Washer_A产品标准---Washer_A生产了!
***符合WasherFactory_B_Depart工厂标准---
==符合Washer_B产品标准---Washer_B生产了!
***符合IceBoxFactory_A_Depart工厂标准---
==符合IceBox_A产品标准---IceBox_A生产了!
***符合IceBoxFactory_B_Depart工厂标准---
==符合IceBox_B产品标准---IceBox_B生产了!
***符合AirConditionFactory_A_Depart工厂标准---
==符合AirCondition_A产品标准---AirCondition_A生产了!
***符合AirConditionFactory_B_Depart工厂标准---
==符合AirCondition_B产品标准---AirCondition_B生产了!
posted @ 2018-04-06 23:25  奔跑在梦想的道路上  阅读(176)  评论(0编辑  收藏  举报