工厂模式
应用场景:当用户需要一个类的子类实例,且不希望与该类的子类形成耦合或者不知道该类有哪些子类可用时,可采用工厂模式;当用户需要系统提供多个对象,且希望和创建对象的类解耦时,可采用抽象工厂模式。
简单工厂
假设一个汽车工厂生产高中抵挡小汽车。
//定义小汽车接口
public interface ICar {
}
// 高档小汽车
public class UpCar implements ICar {
}
// 定义中档小汽车
public class MidCar implements ICar {
}
// 定义抵挡汽车
public class DnCar implements ICar {
}
简单工厂类实现:
public class CarSimpleFactory {
public static final String UPTYPE = "uptype";
public static final String MIDTYPE = "midtype";
public static final String DNTYPE = "dntype";
public static ICar create(String mark){
ICar obj = null;
if(mark.equals(UPTYPE)){
obj = new UpCar();
}else if (mark.equals(MIDTYPE)){
obj = new MidCar();
}else{
obj = new DnCar();
}
return obj;
}
}
工厂
抽象产品+抽象工厂模式:工厂模式把简单工厂类CarSimpleFactory划分成两层:抽象工厂层+具体工厂子类层。抽象工厂层的划分丰富了程序框架的内涵,符合从一般到特殊的语法特点。
//定义小汽车接口
public interface ICar {
}
// 高档小汽车
public class UpCar implements ICar {
}
// 定义中档小汽车
public class MidCar implements ICar {
}
// 定义抵挡汽车
public class DnCar implements ICar {
}
//定义抽象工厂:
public abstract class AbstractFactory {
public abstract ICar create();
}
// 定义高档小汽车工厂
public class UpFactory extends AbstractFactory {
@Override
public ICar create() {
return new UpCar();
}
}
// 定义中档小汽车工厂
public class MidFactory extends AbstractFactory {
@Override
public ICar create() {
return new MidCar();
}
}
// 定义底档小汽车工厂
public class DnFactory extends AbstractFactory {
@Override
public ICar create() {
return new DnCar();
}
}
测试方法
@Test
public void abstractFactory(){
AbstractFactory obj = new UpFactory();
ICar iCar = obj.create();
}
- create()方法参数的理解:在简单工厂模式中,create(String mark)是成员方法,表明在该方法中管理无数多个产品,根据mark的值产生并返回Icar对象;在工厂模式中,create()是抽象方法,无参数,表明在具体的子类工厂中创建某个具体的产品。
- 工厂方法更易于软件的二次开发和维护,其主要特征是:当需求分析发生变化时,只需要增加、删除相应的类,而不是修改已有的类。在简单工厂中则必须修改CarSimpleFactory中create方法,增加选择分支,因此可以看出;工厂模式优于简单工厂模式。
抽象工厂
一般来说,简单工厂、工厂模式是单产品系,而抽象工厂是多产品系的。从本质上说,抽象工厂、工厂模式是统一的。
比如还要生产高中抵挡公交车具体代码实现如下:
public interface ICar { }
public class UpCar implements ICar { }
public class MidCar implements ICar { }
public class DnCar implements ICar { }
public interface IBus { }
public class UpBus implements IBus { }
public class MidBus implements IBus { }
public class DnBus implements IBus { }
//定义抽象工厂:
public abstract class AbstractFactory {
public abstract ICar createCar(); // 生产小汽车
public abstract IBus createBus(); // 生产公交车
}
// 定义高档汽车工厂
public class UpFactory extends AbstractFactory {
@Override
public ICar createCar() {
return new UpCar();
}
@Override
public IBus createBus() {
return new UpBus();
}
}
// 定义中档汽车工厂
public class MidFactory extends AbstractFactory {
@Override
public ICar createCar() {
return new MidCar();
}
@Override
public IBus createBus() {
return new MidBus();
}
}
// 定义底档汽车工厂
public class DnFactory extends AbstractFactory {
@Override
public ICar createCar() {
return new DnCar();
}
@Override
public IBus createBus() {
return new DnBus();
}
}