工厂设计模式(factory)
在面向对象的编程过程中,需要不断的创建对象,当创建对象的过程中过于复杂,并且创建对象又相对独立的时候我们就需要工厂模式来封装创建对象的过程。而我们在使用对象的时候不用必须了解该对象产生的过程。
在没有工厂模式之前,我们基本上就是随用随new。后来出现了一个管理者,管理对象的生产,在需要使用对象的时候直接去管理者那里去拿就ok了,这个管理着就是工厂类。工厂模式分为三种
1.简单工厂模式
顾名思义就是乞丐版工厂模式,非常简单呗。
publicclassXiaoMing{
publicvoidsay(){
System.out.println("大家好,我是小明");
}
}
publicclassLiHua{
publicvoidsay(){
System.out.println("大家好,我是李华");
}
}
/**
* 工厂类
* @author Administrator
*
*/
publicclassObjectFactory{
publicstaticXiaoMinggetXiaoMingNewInstance(){
returnnewXiaoMing();
}
publicstaticLiHuagetLiHuaNewInstance(){
returnnewLiHua();
}
}
publicstaticvoidmain(String[]args){
System.out.println("我需要一个小明");
ObjectFactory.getXiaoMingNewInstance().say();
}
2.工厂方法模式
简单工厂模式的弊端,假如我有n+1个类需要工厂生产,则工厂类里面就要有n+1个工厂生产的逻辑代码,针对于工厂类也不符合开闭原则(对于修改关闭,对扩展开放),假如我们新增一个类就要修改工厂类代码。工厂方法模式的出现解决了该问题。
与简单工厂的区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂。
把工厂抽象话,工厂生产的的对象有子类控制。
1.抽象工厂类(规定创建的动作)
2.为每个业务类创建一个工厂类的子类(规定创建单个对象的具体实现)
packageMethodFactory;
publicabstractclassFactory{
publicabstractEntitycreadeObject();
}
packageMethodFactory;
publicclassFactoryImplLiHuaextendsFactory{
@Override
publicLiHuacreadeObject(){
returnnewLiHua();
}
}
packageMethodFactory;
publicclassFactoryImplXiaoMingextendsFactory{
publicXiaoMingcreadeObject(){
returnnewXiaoMing();
}
}
packageMethodFactory;
publicinterfaceEntity{
voidsay();
}
packageMethodFactory;
publicclassLiHuaimplementsEntity{
publicvoidsay(){
System.out.println("大家好,我是李华");
}
}
packageMethodFactory;
publicclassXiaoMingimplementsEntity{
publicvoidsay(){
System.out.println("大家好,我是小明");
}
}
packageMethodFactory;
publicclassText{
publicstaticvoidmain(String[]args){
System.out.println("麻烦给创建一个李华");
Factoryfactory=newFactoryImplLiHua();
Entityentity=factory.creadeObject();
entity.say();
}
}
该方式解决了增加新的业务类时修改工厂类的弊端
3.抽象工厂方法模式
用于当业务类之间存在关联的是,同时创建两个相对应的业务类对象。
抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象
假设在北京西城有一户人家有两个孩子,李华和李四。东城有一户人家有两个孩子,小明和张三,现在张三和李四要结婚,李华和小明结婚,需要找两个婚庆公司。代码设计如下:
西城人家抽象类:
packageabsFactory;
publicinterfaceXiChengEntity{
voidsay();
}
两个孩子:
packageabsFactory;
publicclassLiHuaimplementsXiChengEntity{
publicvoidsay(){
System.out.println("大家好,我是李华");
}
}
packageabsFactory;
publicclassLiSiimplementsXiChengEntity{
@Override
publicvoidsay(){
// TODO Auto-generated method stub
System.out.println("大家好,我是李四");
}
}
东城人家抽象类:
packageabsFactory;
publicinterfaceDcChengEntity{
voidsay();
}
两个孩子:
packageabsFactory;
publicclassXiaoMingimplementsDcChengEntity{
publicvoidsay(){
System.out.println("大家好,我是小明");
}
}
packageabsFactory;
publicclassZhangSanimplementsDcChengEntity{
@Override
publicvoidsay(){
// TODO Auto-generated method stub
System.out.println("大家好,我是张三");
}
}
婚庆公司(工厂类)
packageabsFactory;
/**
* 婚庆公司 抽象工厂类
* @author Administrator
*
*/
publicabstractclassFactoryAbs{
abstractXiChengEntitycreadObjectXi();
abstractDcChengEntitycreadObjectDc();
}
小明与李华的婚庆公司:
packageabsFactory;
/**
* 李华与小明的婚庆公司
* @author Administrator
*
*/
publicclassFactoryAbsImplLXextendsFactoryAbs{
@Override
XiChengEntitycreadObjectXi(){
returnnewLiHua();
}
@Override
DcChengEntitycreadObjectDc(){
returnnewXiaoMing();
}
}
张三与李四的婚庆公司:
packageabsFactory;
/**
* 张三与李四的婚庆公司
* @author Administrator
*
*/
publicclassFactoryAbsImplLZextendsFactoryAbs{
@Override
XiChengEntitycreadObjectXi(){
returnnewLiSi();
}
@Override
DcChengEntitycreadObjectDc(){
returnnewZhangSan();
}
}
婚礼现场:
packageabsFactory;
publicclassText{
publicstaticvoidmain(String[]args){
System.out.println("李四与张三结婚了,新人出厂!");
FactoryAbsfactory=newFactoryAbsImplLZ();
factory.creadObjectDc().say();;
factory.creadObjectXi().say();;
System.out.println("李华与小米结婚了,新人出厂!");
FactoryAbsfactory2=newFactoryAbsImplLX();
factory2.creadObjectDc().say();;
factory2.creadObjectXi().say();;
}
}