工厂模式在程序设计中是经常用到的一个设计模式,它可以将系统的构建过程和使用过程解耦。
工厂模式分为三种:
(1)简单工厂模式
(2)工厂方法模式
(3)抽象工厂模式
(1)简单工厂模式
场景:制作戴尔鼠标和惠普鼠标
分析:
(1)戴尔鼠标和惠普鼠标都是鼠标,其中都有“制作”这个行为;
(2)为了方便生产,来一个工厂统一制造这两种品牌鼠标;
定义一个鼠标接口,声明两种鼠标共同的行为doOption
public interface Mouse {
public void doOption();
}
创建戴尔鼠标对象,并实现“制造”行为
public class DellMouse implements Mouse {
@Override
public void doOption() {
System.out.println("制作戴尔鼠标");
}
}
创建惠普鼠标对象,并实现“制造”行为
public class HpMouse implements Mouse{
@Override
public void doOption() {
System.out.println("制作惠普鼠标");
}
}
创建一个工厂,统一管理这两种鼠标
public class MouseFactory {
private static Mouse mouse;
/**
* 简单工厂模式
* @param flag 0:戴尔鼠标 1:惠普鼠标
* @return
*/
public static Mouse createMouse(int flag){
switch (flag){
case 0:
mouse = new DellMouse();
break;
case 1:
mouse = new HpMouse();
break;
}
return mouse;
}
}
使用
Mouse mouse1 = MouseFactory.createMouse(0);
mouse1.doOption();
Mouse mouse2 = MouseFactory.createMouse(1);
mouse2.doOption();
以上就是简单工厂模式了。
缺点:生产哪种鼠标由参数决定, 在使用的时候,参数的意义不明确,使用困难。
个人理解:虽然简单工厂模式有缺陷,但是如果需要区分的参数不是太多,并且添加注释说面每个参数的意思也是可以这样写的。
(2)工厂方法模式
场景:和(1)类似, 也是生产两种不同品牌的鼠标。
分析:为了解决(1)中“参数的意义不明确”的弊端,可以将工厂分离,即工厂A专门生产戴尔鼠标,工厂B专门生产惠普鼠标。
定义一个鼠标接口,声明两种鼠标共同的行为doOption
public interface Mouse {
public void doOption();
}
创建戴尔鼠标对象,并实现“制造”行为
public class DellMouse implements Mouse {
@Override
public void doOption() {
System.out.println("制作戴尔鼠标");
}
}
创建惠普鼠标对象,并实现“制造”行为
public class HpMouse implements Mouse{
@Override
public void doOption() {
System.out.println("制作惠普鼠标");
}
}
定义一个专门生产戴尔鼠标的工厂
public class DellMouseFactory implements MouseFactory {
@Override
public Mouse createMouse() {
return new DellMouse();
}
}
定义一个专门生产惠普鼠标的工厂
public class HpMouseFactroy implements MouseFactory {
@Override
public Mouse createMouse() {
return new HpMouse();
}
}
使用
//工厂模式(生产哪种鼠标由对象决定)
Mouse mouse1 = new DellMouseFactory().createMouse();
mouse1.doOption();
Mouse mouse2 = new HpMouseFactroy().createMouse();
mouse2.doOption();
优点:
(1)避免了简单工厂模式参数不清晰的问题;
(2)生产哪种品牌的鼠标由工厂对象决定;
(3)抽象工厂模式
说明:
(1)当抽象工厂模式的产品只有一个的时候,即变成工厂模式;
(2)当工厂模式的产品变成多个时,即变成抽象工厂模式;
场景:有两个工厂,分别是戴尔工厂和惠普工厂,戴尔工厂生产对应品牌的鼠标和键盘,惠普工厂也生产对应品牌的鼠标和键盘;
定义一个鼠标接口,声明两种鼠标共同的行为doOption
public interface Mouse {
public void doOption();
}
创建戴尔鼠标对象,并实现“制造”行为
public class DellMouse implements Mouse {
@Override
public void doOption() {
System.out.println("制作戴尔鼠标");
}
}
创建惠普鼠标对象,并实现“制造”行为
public class HpMouse implements Mouse{
@Override
public void doOption() {
System.out.println("制作惠普鼠标");
}
}
定义一个键盘接口,声明两种鼠标共同的行为sayHi
public interface KeyBoard {
void sayHi();
}
创建戴尔键盘对象,并实现其行为
public class DellKeyBoard implements KeyBoard{
@Override
public void sayHi() {
System.out.println("我是戴尔键盘");
}
}
创建惠普键盘对象,并实现其行为
public class HpKeyBoard implements KeyBoard {
@Override
public void sayHi() {
System.out.println("我是惠普键盘");
}
}
定义一个戴尔工厂,用来生产对应品牌的鼠标和键盘
public class DellFactory implements PcFactory {
@Override
public Mouse createMouse() {
return new DellMouse();
}
@Override
public KeyBoard createKeyBoard() {
return new DellKeyBoard();
}
}
定义一个惠普工厂,用来生产对应品牌的鼠标和键盘
public class HpFactory implements PcFactory {
@Override
public Mouse createMouse() {
return new HpMouse();
}
@Override
public KeyBoard createKeyBoard() {
return new HpKeyBoard();
}
}
使用
Mouse mouse5 = new DellFactory().createMouse();
mouse5.doOption();
KeyBoard keyBoard1 = new DellFactory().createKeyBoard();
keyBoard1.sayHi();
Mouse mouse6 = new HpFactory().createMouse();
mouse6.doOption();
KeyBoard keyBoard2 = new HpFactory().createKeyBoard();
keyBoard2.sayHi();
总结:
(1)简单工厂模式,还是真的简单,用一个杂牌工厂类生产多个杂牌产品,在使用该模式的时候,需要传递一个参数,这个参数用来区分不同的产品;
(2)工厂模式(工厂方法模式),用多个工厂分别生产不同品牌的单个产品;
(3)抽象工厂模式,用多个工厂分别生产不同品牌的多个产品;
[本章完...]