工厂模式

工厂模式

应用场景:当用户需要一个类的子类实例,且不希望与该类的子类形成耦合或者不知道该类有哪些子类可用时,可采用工厂模式;当用户需要系统提供多个对象,且希望和创建对象的类解耦时,可采用抽象工厂模式。

简单工厂

假设一个汽车工厂生产高中抵挡小汽车。

//定义小汽车接口
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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值