一、工厂模式
1、工厂模式的关键点就是如何描述好这两个角色之间的关系,分为四种情况:
(1)单一产品系,工厂生产一种类型的产品;
(2)多产品系,特征相同。工厂生产多种类型的产品;
(3)多产品系,部分特征相同;
(4)多产品系,无特征相同。
工厂模式一般分为简单工厂、工厂、抽象工厂3种情况,属于创建型设计模式。
2、简单工厂设计模式
(1)定制抽象产品接口;
(2)定制具体产品子类;
(3)定制工厂类,简单工厂类的特点:它是一个具体的类,非接口或抽象类。其中有一个重要的create()方法,利用if...else或switch开关创建所需产品,并返回。
[代码]java代码:
1
2
3
4
5
|
package com.example.demo6;
//定义小汽车接口 public interface ICar {
//由于工厂模式仅关系对象的创建,为说明方便,无需定义方法
} |
[代码]java代码:
1
2
3
4
5
|
package com.example.demo6;
//高档小汽车 public class TopCar implements ICar {
} |
[代码]java代码:
1
2
3
4
5
|
package com.example.demo6;
//中档小汽车 public class MidCar implements ICar {
} |
[代码]java代码:
1
2
3
4
5
|
package com.example.demo6;
//低档小汽车 public class LowCar implements ICar {
} |
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
package com.example.demo6;
//简单工厂 public class CarSimpleFactory {
public static final String TOPTYPE= "toptype" ;
public static final String MIDTYPE= "midtype" ;
public static final String LOWTYPE= "lowtype" ;
public static ICar create(String mark){
ICar obj= null ;
if (mark.equals(TOPTYPE)){ //如果是高档类型
obj= new TopCar(); //则创建高档车对象
} else if (mark.equals(MIDTYPE)){
obj= new MidCar();
} else if (mark.equals(LOWTYPE)){
obj= new LowCar();
}
return obj; //返回选择的对象
}
} |
[代码]java代码:
1
2
3
4
5
6
7
8
|
package com.example.demo6;
//测试程序 public class CarTest {
public static void main(String[] args) {
//从工厂中创建对象
ICar obj=CarSimpleFactory.create( "toptype" );
}
} |
3、工厂模式
(1)定制抽象产品接口;
(2)定制具体产品子类;
(3)定制抽象工厂类(或接口),其中有一个重要的create()抽象方法;
(4)定制具体工厂子类。
[代码]java代码:
1
2
3
4
5
|
package com.example.demo8;
//定义小汽车接口 public interface ICar {
} |
[代码]java代码:
1
2
3
4
5
|
package com.example.demo8;
//高档小汽车 public class TopCar implements ICar {
} |
[代码]java代码:
1
2
3
4
5
|
package com.example.demo8;
//中档小汽车 public class MidCar implements ICar {
} |
[代码]java代码:
1
2
3
4
5
|
package com.example.demo8;
//低档小汽车 public class LowCar implements ICar {
} |
[代码]java代码:
1
2
3
4
5
|
package com.example.demo8;
//定义抽象工厂 public abstract class AbstractFactory {
public abstract ICar create();
} |
[代码]java代
01
02
03
04
05
06
07
08
09
10
|
package com.example.demo8;
//定义高档小汽车工厂 public class TopFactory extends AbstractFactory {
@Override
public ICar create() {
return new TopCar(); //高档工厂生成高档小气车对象
}
} |
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
|
package com.example.demo8;
//定义中档小汽车工厂 public class MidFactory extends AbstractFactory {
@Override
public ICar create() {
return new LowCar(); //低档工厂生成低档小汽车对象
}
} |
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
|
package com.example.demo8;
//定义低档小汽车工厂 public class LowFactory extends AbstractFactory {
@Override
public ICar create() {
return new MidCar(); //低档工厂生成中档小汽车
}
} |
[代码]java代码:
1
2
3
4
5
6
7
8
|
package com.example.demo8;
//测试类 public class CarTest {
public static void main(String[] args) {
AbstractFactory obj= new TopFactory(); //多态创建高档工厂
ICar car=obj.create(); //获得高档工厂中的小汽车对象
}
} |
4、工厂与简单工厂模式的区别。
(1)工厂模式把简单工厂中具体的工厂类划分为两层:抽象工厂层+具体工厂子类层。抽象工厂层的划分丰富了程序框架的内涵,符合从一般到特殊的语义特点。
(2)create()方法参数的理解:在简单工厂中,create(String mark)是成员方法,表明在该方法中管理多个产品,根据mark的值产生并返回ICar对象;在工厂模式中,create()是抽象方法,无参数,表明在具体的子类工厂中创建某个具体的产品。
(3)工厂方法更易于软件的二次开发及维护,主要特征是:当需求分析变化时,只需要增加、删除相应的类,而不是修改已有的类。
5、抽象工厂
(1)定制抽象产品接口;
(2)定制具体产品类子类;
(3)定制抽象工厂类(或接口),其中有两个重要的create()抽象方法;
(4)定制具体工厂子类,每个工厂子类中重写create()方法。
[代码]java代码:
1
2
3
|
package com.example.demo9;
//定义小汽车接口 public interface ICar {}
|
[代码]java代码:
1
2
3
|
package com.example.demo9;
//定义高档小汽车类 public class TopCar implements ICar {}
|
[代码]java代码:
1
2
3
|
package com.example.demo9;
//定义中档小汽车类 public class MidCar implements ICar {}
|
[代码]java代码:
1
2
3
|
package com.example.demo9;
//定义低档小汽车类 public class LowCar implements ICar {}
|
[代码]java代码:
1
2
3
|
package com.example.demo9;
//定义公共汽车接口 public interface IBus {}
|
[代码]java代码:
1
2
3
|
package com.example.demo9;
//定义高档公共汽车类 public class UpBus implements IBus {}
|
[代码]java代码:
1
2
3
|
package com.example.demo9;
//定义中档公共汽车类 public class MidBus implements IBus {}
|
[代码]java代码:
1
2
3
|
package com.example.demo9;
//定义低档公共汽车类 public class DnBus implements IBus {}
|
[代码]java代码:
1
2
3
4
5
6
|
package com.example.demo9;
//定义抽象工厂 public abstract class AbstractFactory {
public abstract ICar createCar(); //产生小汽车对象
public abstract IBus createBus(); //产生公共汽车对象
} |
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
package com.example.demo9;
//定义高档工厂 public class TopFactory extends AbstractFactory {
@Override
public ICar createCar() {
return new TopCar(); //高档工厂生成高档小汽车对象
}
@Override
public IBus createBus() {
return new UpBus(); //高档工厂生成高档公共汽车对象
}
} |
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
package com.example.demo9;
//定义中档工厂 public class MidFactory extends AbstractFactory {
@Override
public ICar createCar() {
return new MidCar(); //中档工厂生成中档小汽车
}
@Override
public IBus createBus() {
return new MidBus(); //中档工厂生成中档公共汽车
}
} |
[代码]java代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
package com.example.demo9;
//定义低档工厂 public class LowFactory extends AbstractFactory {
@Override
public ICar createCar() {
return new LowCar(); //低档工厂生成低档小汽车对象
}
@Override
public IBus createBus() {
return new DnBus(); //低档工厂生成低档公共汽车对象
}
} |