设计模式——抽象工厂模式

定义:java

 抽象工厂模式提供一个接口,用于建立相关或者依赖对象的家族,而不须要明确指定具体类。ide

 抽象工厂容许客户端使用抽象的接口来建立一组相关的产品,而不须要关系实际产出的具体产品是什么。这样一来,客户就能够从具体的产品中被解耦。ui

 

示例代码:设计

Fruit.java对象

package com.designPattern.abstractFactory;

/***
 * 
 * @author liuzhihu
 *
 */
public interface Fruit {

	/***
	 * 定义吃水果的方法
	 */
	public void eatFruit();

}

  

Apple.javablog

package com.designPattern.abstractFactory;

/***
 * 
 * @author liuzhihu
 *
 */
public abstract class Apple implements Fruit {

	public abstract void eatFruit();
}

 

Banana.java接口

package com.designPattern.abstractFactory;

/***
 * 
 * @author liuzhihu
 *
 */
public abstract class Banana implements Fruit {

	public abstract void eatFruit();
}

  

NorthApple.javaget

package com.designPattern.abstractFactory;

public class NorthApple extends Apple {

	@Override
	public void eatFruit() {
		
		System.out.println("吃北方苹果。。。。。。");

	}

}

 

NorthBanana.java产品

package com.designPattern.abstractFactory;

public class NorthBanana extends Banana {

	@Override
	public void eatFruit() {

		System.out.println("吃北方香蕉。。。。。。");

	}

}

 

SouthApple.javait

package com.designPattern.abstractFactory;

public class SouthApple extends Apple {

	@Override
	public void eatFruit() {

		System.out.println("吃南方苹果。。。。。。");

	}

}

 

SouthBanana.java

package com.designPattern.abstractFactory;

public class SouthBanana extends Banana {

	@Override
	public void eatFruit() {

		System.out.println("吃南方香蕉。。。。。。");

	}

}

  

FruitFactory.java

package com.designPattern.abstractFactory;

public abstract class FruitFactory {

	/***
	 * 采集水果
	 * 
	 * @param type
	 * @return
	 */
	public abstract Fruit getFruit(String type);

}

  

NorthFruitFactory.java

package com.designPattern.abstractFactory;

public class NorthFruitFactory extends FruitFactory {

	@Override
	public Fruit getFruit(String type) {

		if ("Apple".equals(type)) {

			return new NorthApple();

		} else if ("Banana".equals(type)) {

			return new NorthBanana();

		} else {

			System.out.println("找不到对应的水果......");

			return null;
		}

	}

}

  

SouthFruitFactory.java

package com.designPattern.abstractFactory;

public class SouthFruitFactory extends FruitFactory {

	@Override
	public Fruit getFruit(String type) {

		if ("Apple".equals(type)) {

			return new SouthApple();

		} else if ("Banana".equals(type)) {

			return new SouthBanana();

		} else {

			System.out.println("找不到对应的水果......");

			return null;
		}

	}

}

  

MainTest.java

package com.designPattern.abstractFactory;

public class MainTest {

	public static void main(String[] args) {

		// 北方水果
		NorthFruitFactory northFruitFactory = new NorthFruitFactory();

		Fruit northApple = northFruitFactory.getFruit("Apple");

		northApple.eatFruit();

		Fruit northBanana = northFruitFactory.getFruit("Banana");

		northBanana.eatFruit();

		// 南方水果
		SouthFruitFactory southFruitFactory = new SouthFruitFactory();

		Fruit southApple = southFruitFactory.getFruit("Apple");

		southApple.eatFruit();

		Fruit southBanana = southFruitFactory.getFruit("Banana");

		southBanana.eatFruit();

	}

}

  

优势

           一、  抽象工厂隔离了具体类的生成,是的客户端不须要知道什么被建立。全部的具体工厂都实现了抽象工厂中定义的公共接口,所以只须要改变具体工厂的实例,就能够在某种程度上改变整个软件系统的行为。

           二、  当一个产品族中的多个对象被设计成一块儿工做时,它可以保证客户端始终只使用同一个产品族中的对象。

 缺点

           添加新的行为时比较麻烦。若是须要添加一个新产品族对象时,须要更改接口及其下全部子类,这必然会带来很大的麻烦。

相关文章
相关标签/搜索