【java】设计模式之工厂系列

以Car类为例:

情况一:new出的Car对象数量由本类决定,限制其他类(司机类)不去new Car对象:

将Car的构造函数设置为private Car(){ }

在Car类中:

private static Car car = new Car();

public static Car getInstance() {    return car;    }

 

说明:上例中从始至终只有一个实例,称为单例模式

getInstance() 称为静态工厂方法。在类中控制了产生对象的逻辑,都可称为工厂相关的方法。

 

多例模式

private static List cars = new ArrayList();

 

 

情况二:由客户任意定制生产类型和过程

新建Factory工程;

新建cn.edu.seu.factory包;

1.为了任意定制(交通工具)类型:定义Interface Movable;内有方法void run()(Interface里的方法默认为public)

用法: Movable  m = new Plane();

m.run();

 

2.为了控制生产过程:定义类PlaneFactory,内含方法:

public createPlane(){       return new Plane();    }

则上面的生产过程变成:

PlaneFactory factory = new PlaneFactory();

Movable  m = factory.createPlane();

 

3.为了统一Car和Plane的制造方法,创建abstract父类VehicleFactory,内含方法abstract Movable create();CarFactory 和PlaneFactory都从VehicleFactory继承。

 

4.添加新类的过程:创建类Broom从Movable类继承,实现了run方法;

再创建类BroomFactory 实现VehicleFactory接口,重写其create方法。

在测试类中:VehicleFactory factory = new VehicleFactory();

Movable m = factory.create();

m.run();

 

情况三:抽象工厂,用于解决系列产品的方便替换问题

新建cn.edu.seu.factory.abstract包:

1.新建DefaultFactory类:其中有可以产生Car、Ak47、Apple的方法;

若要替换所有产品,则要新建MagicFactory:其中有可以产生别的产品的方法:Broom、Arrow、Mushroom

2.新建abstract类AbstractFactory:其中含有

public abstract Vehicle的VehicleCreate方法;

public abstract Weapon的WeaponCreate方法

public abstract food的FoodCreate方法;

然后分别新建上述三种抽象类。

然后Car、Broom继承Vehicle类;Ak47、Arrow继承Weapon类;Apple、Mushroom继承Food类。

 

总结:

1.从源开始,首先是抽象的AbstractFactory类,其中有生产多种抽象产品类的方法***Create()。

2.DefaultFactory和MagicFactory都由AbstractFactory继承,各自重写抽象类的实际产品类***Create方法。

3.2中的实际产品类要继承1中的抽象产品类

4.在测试程序中,这样使用:

AbstractFactory f = new MagicFactory();

Vehicle v = f.creatVehicle();

v.run();

Weapon w = f.createWeapon();

w.shoot();

Food a = f.createFood();

a.printName();

这样,要想替换系列产品,只要换掉上面的MagicFactory改为DefaultFactory就行。

想换成自己的系列产品:自己继承AbstractFactory产生MyFactory类,继承Vehicle类产生myCar类…其他类也如此。

 

提问:抽象工厂和普通工厂相比,长处和短处?

对于普通产品来说,我们是可以扩展产品的,但是在产生产品系列的时候会产生工厂泛滥的现象;

而抽象工厂可以产生新的产品系列,但是若要添加新的产品品类,则会很麻烦,需要对所以继承自抽象工厂的所有类都添加心的方法。

此条目发表在Java技术分类目录,贴了, , 标签。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注