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

来源:互联网 发布:网狐棋牌源码 编辑:程序博客网 时间:2024/05/19 17:56

抽象工厂(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();    }}
原创粉丝点击