`

设计模式之 抽象工厂

阅读更多

  前面学习了简单工厂和工厂方法模式,今天来学习工厂模式中最最抽象的一种-- 抽象工厂模式。抽象工厂模式比工厂方法处理的问题更具有抽象性与一般性。它们的区别在于: 工厂方法模式针对的是一个产品等级结构;而抽象工厂模式是针对多个产品等级结构而出现的。

 

  说的通俗点,一个产品等级结构就是一类产品类的总称;例如: 运动鞋,休闲鞋,皮鞋等,所有鞋的种类就构成一个鞋的等级结构。而当两个或两个以上具有相同或相似等级结构的产品组合在一起时,或者在此基础上添加新的产品等级结构时,使用抽象工厂模式,就为这种添加或修改带来了更好的灵活性。下面以一个例子来说明抽象工厂模式的实用性。

 

  在学习工厂方法模式的时候,提到了一个例子,制鞋厂扩大生成规模,由本来只生产一种类型的鞋子,扩大到生产各色各样的鞋子类型。现在制鞋厂又想进一步扩大自己的市场;在原来制造鞋子的基础上,也制造衣服。并且希望推出其对应的运行型套装,商务型套装,休闲型套装等等一系列的自主品牌产品。这样问题就来了,如果以原来工厂方法的模式来设计,一个具体产品,对应一个具体工厂,那么新加入服饰产品,也要相应提供其具体服饰产品的工厂类。这样就会造成工厂泛滥的情况。在实际中,也不可能会出现为生成一种产品,就建一个工厂的情况。

 

  所以,我们就必须考虑使用抽象工厂模式去解决以上的问题。将同一类型的不同产品统一由一个具体工厂创建。下面为该例子的代码实现。

 

/**
 * 鞋子产品抽象类
 * @author Administrator
 *
 */
public abstract class Shoe {
	/*
	 * 鞋子属性
	 */
	private String color; // 鞋子颜色
	private String size; // 码数
	
	/*
	 * 提供默认的构造方法
	 */
	public Shoe(){
		this.color = "红色";
		this.size = "43";
	}
	
	/*
	 * 行为
	 */
	public abstract void walk();
	
                /*
                 * 访问其属性的方法
           */
	public String showColor(){
		return this.color;
	}
	
	public String showSize(){
		return this.size;
	}

 

/**
 * 运动鞋产品类
 * @author Administrator
 *
 */
public class SportShoe extends Shoe {

	@Override
	public void walk() {
		// TODO Auto-generated method stub
		System.out.println("do something...");
	}

}

 

 

/**
 * 商务型皮鞋
 * @author Administrator
 *
 */
public class BuniessShoe extends Shoe {

	@Override
	public void walk() {
		// TODO Auto-generated method stub
		System.out.println("do something...");
	}

}

 

 

/*
 * 衣服抽象类
 */
public abstract class Clothes {

	/*
	 * 属性
	 */
	private String color;
	private String size;
	
	public Clothes(){
		this.color = "红色";
		this.size = "180cm";
	}
	
	public abstract void wear();

 

public class SportClothes extends Clothes {

	@Override
	public void wear() {
		// TODO Auto-generated method stub
		System.out.println("sport wear...");
	}

}

 

public class BuniessClothes extends Clothes {

	@Override
	public void wear() {
		// TODO Auto-generated method stub
		System.out.println("buniess wear...");
	}

}

 

工厂类

 

/**
  * 抽象工厂类,类中定义了两个创建方法
  */
public abstract class Factory {
                // 生产鞋子
	public abstract Shoe createShoe();
	// 生产衣服
	public abstract Clothes createClothes();
}

 

/**
 * 运动型品牌工厂类
 * @author Administrator
 *
 */
public class SportFactory extends Factory {

	@Override
	public Clothes createClothes() {
		// TODO Auto-generated method stub
		return new SportClothes();
	}

	@Override
	public Shoe createShoe() {
		// TODO Auto-generated method stub
		return new SportShoe();
	}

}

 

/**
 * 商务型品牌工厂类
 * @author Administrator
 *
 */
public class BuniessFactory extends Factory {

	@Override
	public Clothes createClothes() {
		// TODO Auto-generated method stub
		return new BuniessClothes();
	}

	@Override
	public Shoe createShoe() {
		// TODO Auto-generated method stub
		return new BuniessShoe();
	}

}

  

    测试类

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		/**
		 * 抽象工厂模式的测试类
		 */
		// 首先我想使用一个运动工厂,创建一套运动服
		Factory sportFactory = new SportFactory();
		Clothes sportClothes = sportFactory.createClothes();
		Shoe sportShoe = sportFactory.createShoe();
		
		sportClothes.wear();
		sportShoe.walk();
		
		// 然后我想创建一个商务工厂,创建一套商务套装
		Factory buniessFactory = new BuniessFactory();
		Clothes buniessClothes = buniessFactory.createClothes();
		Shoe buniessShoe = buniessFactory.createShoe();
		
		buniessClothes.wear();
		buniessShoe.walk();
		
	}

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics