您的位置:首页 > 编程语言 > Java开发

Java设计模式之抽象工厂模式

2017-09-08 20:12 459 查看

抽象工厂(abstract factory)

概念指当有多个抽象角色时,使用的一种工厂模式

抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象

优点:

1.隔离了具体类的生成,使得客户不需要知道什么被创建了

2.当一个产品族中的多个对象被设计成一起工作时,能保证客户端始终只使用一个产品族中的对象

适用:

1.一个系统要独立于它的产品的创建、组合和表示时。

2.一个系统要由多个产品系列中的一个来配置时。

3.当你强调一系列相关的产品对象的设计以便进行联合使用时。

4.当你提供一个产品类库,而只想显示他们的接口而不是实现时。



普通工厂与抽象工厂的比较:

普通工厂的短处:产生产品系列的时候会很麻烦,工厂泛滥;

抽象工厂的短处:产生产品品种的时候要改动的地方太多;

案例代码:



实体:

/**
* 抽象工厂
* 包含所有产品创建的抽象方法
* 可添加其他方法(生产其他品种)
* @author 落尘曦 2017.9.8
*/
public abstract class AbstractFactory {
public abstract Vehicle createVehicle(); //创建交通工具
public abstract Food createFood();//创建食物
}


/**
* 相当于AbstractProductA
* @author 落尘曦 2017.9.8
*/
public abstract class Vehicle {
public abstract void run();
}


/**
* 相当于AbstractProductB
* @author 落尘曦 2017.9.8
*/
public abstract class Food {
public abstract void eat();
}


/**
* 第一个具体工厂
* 相当于ConcreteFactory1
* 生产“车”和“苹果”
* @author 落尘曦 2017.9.8
*/
public class FirstFactory extends AbstractFactory{
//创建交通工具
public Vehicle createVehicle() {
return new Car(); //返回汽车
}
//创建食物
public Food createFood() {
return new Apple(); //返回苹果
}
}


/**
* 第二个具体工厂
* 相当于ConcreteFactory1
* 生产“飞机”和“水”
* @author 落尘曦 2017.9.8
*/
public class SecondFactory extends AbstractFactory{
//创建交通工具
public Vehicle createVehicle() {
return new Plane(); //返回飞机
}
//创建食物
public Food createFood() {
return new Water(); //返回水
}
}


/**
* 相当于ProductA1
* @author 落尘曦 2017.9.8
*/
public class Car extends Vehicle{
public void run(){
System.out.println("开车...");
}
}


/**
* 相当于ProductA2
* @author 落尘曦 2017.9.8
*/
public class Plane extends Vehicle{
public void run(){
System.out.println("开飞机...");
}
}


/**
* 相当于ProductB1
* @author 落尘曦 2017.9.8
*/
public class Water extends Food{
public void eat(){
System.out.println("喝着水...");
}
}


/**
* 相当于ProductB2
* @author 落尘曦 2017.9.8
*/
public class Apple extends Food{
public void eat(){
System.out.println("吃着苹果...");
}
}


测试类:

/**
* 抽象工厂模式的测试
* 系列产品(交通工具,食物...)
* @author 落尘曦 2017.9.8
*/
public class Test {
public static void main(String[] args) {
AbstractFactory f = new SecondFactory();
f.createVehicle().run();
f.createFood().eat();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: