本文从以下方面介绍工厂模式
一、总述
二、工厂方法
三、抽象工厂
一、总述
1、分类:
(1)简单工厂(静态工厂)
(2)工厂方法模式
(3)抽象工厂模式
2、工厂模式意义:
将程序中创建对象的部分单独抽取出来,实现与主程序之间的解耦。具有更好的扩展性及维护性。
3、工厂方法模式与抽象工厂模式异同点
(1)相同点:都是将对象(产品)单独抽取形成一个产品族,然后将创建对象的工厂也向上抽取形成一个工厂族
(2)异同点:
①抽象工厂中会有一系列的产品,而工厂方法中只有一个抽象的产品;
②抽象工厂模式的具体工厂中可以创建多个产品的实例,而工厂方法的具体工厂中只能创建一个产品的实例
(3)工厂方法模式中的角色:
①一个单一的抽象的产品类,该类可以创建出多个同类型的具体产品类;
②一个抽象工厂类,可以创建出多个具体的工厂类,每个工厂类也只能生产一种产品
(4)抽象工厂模式的角色:
①多个抽象的产品类,可以创建出多种类型的多个具体产品;
②一个抽象工厂类,可以创建出多个具体的工厂,每个工厂可以生产出多种产品
二、工厂方法
引入:任意定制交通工具的类型(一种产品)和生产过程
1、类图
2、代码示例
2.1、交通工具接口
package net.oschina.design.factory1.factorymethod;
/**
* 交通工具的接口类,定制任何一种与交通工具相关的产品
*
* @author Freedom
*
*/
public interface Vehicle {
/**
* vehicel run
*/
void run();
}
2.1.1交通工具的具体实现
package net.oschina.design.factory1.factorymethod;
public class Air implements Vehicle {
@Override
public void run() {
System.out.println("Air like lightning fly...--飞机。");
}
}
package net.oschina.design.factory1.factorymethod;
public class Car implements Vehicle {
@Override
public void run() {
System.out.println("Car quickly run...--汽车。");
}
}
package net.oschina.design.factory1.factorymethod;
public class Train implements Vehicle {
@Override
public void run() {
System.out.println("Train wu wu wu run...--火车。");
}
}
2.2 交通工具的工厂接口
package net.oschina.design.factory1.factorymethod;
/**
*
* @author Freedom
*
*/
public interface VehicleFactory {
Vehicle createVehicle();
}
2.2.1具体的工厂实现类、
package net.oschina.design.factory1.factorymethod;
/**
*
* @author Freedom
*
*/
public class AirFactory implements VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Air();
}
}
package net.oschina.design.factory1.factorymethod;
/**
* @author Freedom
*
*/
public class CarFactory implements VehicleFactory {
@Override
public Vehicle createVehicle() {
/*
* 此处,可以定制小汽车的生产过程等等,此方法只是简单实现
*/
return new Car();
}
}
package net.oschina.design.factory1.factorymethod;
/**
*
* @author Freedom
*
*/
public class TrainFactory implements VehicleFactory {
@Override
public Vehicle createVehicle() {
return new Train();
}
}
2.3、测试方法
package net.oschina.design.factory1.factorymethod;
/**
* 测试工厂方法模式
*工厂方法模式的优点:将对象的创建过程交给一个工厂去完成,实现了程序主流程创建对象时低耦合
* 缺点:每新增一种产品的时候,产品类需要新增加,具体生产该产品的工厂也要新增加,这样会导致工厂泛滥
* 可以将一系列产品放到同一个工厂中,这样如果该产品的系列不变化,只是增加产品的种类就不会引起工厂泛滥,要用到抽象工厂的方法
* @author Freedom
*
*/
public class Main {
public static void main(String[] args) {
VehicleFactory f = new CarFactory();
Vehicle c = f.createVehicle();
c.run();
f = new AirFactory();
Vehicle air = f.createVehicle();
air.run();
}
}
2.4、工厂方法模式的组成
1)抽象工厂:工厂方法模式的核心。是具体工厂角色必须实现的接口或者必须继承的父类;
2)具体工厂:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象;
3)抽象产品:它是具体产品继承的父类或者是实现的接口;
4)具体产品:具体工厂角色所创建的对象就是此角色的实例,在java中由具体的类来实现。
三、抽象工厂
引入:任意定制系列产品(如:交通工具...多种产品)
1、类图
2、代码示例
2.1、产品接口
package net.oschina.design.factory1.abstractFactory;
/**
* 交通工具类
*
* @author Freedom
*
*/
public interface Vehicle {
void run();
}
package net.oschina.design.factory1.abstractFactory;
/**
* 武器类
*
* @author Freedom
*
*/
public interface Weapon {
void shoot();
}
2.1.1产品具体实现
package net.oschina.design.factory1.abstractFactory;
public class Car implements Vehicle {
@Override
public void run() {
System.out.println("Car quickly run...--汽车。");
}
}
package net.oschina.design.factory1.abstractFactory;
public class Train implements Vehicle {
@Override
public void run() {
System.out.println("Train wu wu wu run...--火车。");
}
}
package net.oschina.design.factory1.abstractFactory;
public class Gun implements Weapon {
@Override
public void shoot() {
System.out.println("Gun shotting...--枪。");
}
}
package net.oschina.design.factory1.abstractFactory;
public class Tank implements Weapon {
@Override
public void shoot() {
System.out.println("Tank shooting...--坦克。");
}
}
2.2、抽象工厂抽象类
package net.oschina.design.factory1.abstractFactory;
/**
* 抽象工厂用于生产一系列产品
*
* @author Freedom
*
*/
public abstract class AbstractFactory {
public abstract Vehicle createVehicle();
public abstract Weapon createWeapon();
}
2.2.1抽象工厂的具体实现
package net.oschina.design.factory1.abstractFactory;
/**
* 生产大型工具的工厂
*
* @author Freedom
*
*/
public class BigToolsFactory extends AbstractFactory {
@Override
public Vehicle createVehicle() {
return new Train();
}
@Override
public Weapon createWeapon() {
return new Tank();
}
}
package net.oschina.design.factory1.abstractFactory;
/**
* 小型工具的工厂
*
* @author Freedom
*
*/
public class SmallToolsFactory extends AbstractFactory {
@Override
public Vehicle createVehicle() {
// TODO Auto-generated method stub
return new Car();
}
@Override
public Weapon createWeapon() {
// TODO Auto-generated method stub
return new Gun();
}
}
2.3、运行类
package net.oschina.design.factory1.abstractFactory;
/**
* 测试抽象工厂
*
* @author Freedom
*
*/
public class Main {
public static void main(String[] args) {
/**
* 如果想替换工厂的时,直接将工厂的实现对象替换即可,程序的代码不需要修改
*/
AbstractFactory f = new SmallToolsFactory();
Vehicle v = f.createVehicle();
v.run();
Weapon w = f.createWeapon();
w.shoot();
}
}
2.4、抽象工厂优缺点
(1)抽象工厂模式的优点
①分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
②使切换产品族变得容易
因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从Intel系列到AMD系列只需要切换一下具体工厂。
(2)抽象工厂模式的缺点
①不太容易扩展新的产品系列
如果需要给整个产品族添加一个新的产品系列,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。