读书人

设计形式之 抽象工厂

发布时间: 2012-10-08 19:54:56 作者: rapoo

设计模式之 抽象工厂

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

?

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

?

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

?

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

?

/** * 鞋子产品抽象类 * @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 {@Overridepublic void walk() {// TODO Auto-generated method stubSystem.out.println("do something...");}}

?

?

/** * 商务型皮鞋 * @author Administrator * */public class BuniessShoe extends Shoe {@Overridepublic void walk() {// TODO Auto-generated method stubSystem.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 {@Overridepublic void wear() {// TODO Auto-generated method stubSystem.out.println("sport wear...");}}

?

public class BuniessClothes extends Clothes {@Overridepublic void wear() {// TODO Auto-generated method stubSystem.out.println("buniess wear...");}}

?

工厂类

?

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

?

/** * 运动型品牌工厂类 * @author Administrator * */public class SportFactory extends Factory {@Overridepublic Clothes createClothes() {// TODO Auto-generated method stubreturn new SportClothes();}@Overridepublic Shoe createShoe() {// TODO Auto-generated method stubreturn new SportShoe();}}

?

/** * 商务型品牌工厂类 * @author Administrator * */public class BuniessFactory extends Factory {@Overridepublic Clothes createClothes() {// TODO Auto-generated method stubreturn new BuniessClothes();}@Overridepublic Shoe createShoe() {// TODO Auto-generated method stubreturn 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();}}

?

读书人网 >软件开发

热点推荐