这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。
工厂模式
定义:
工厂模式的主要解决的问题是,将原来分布在各个地方的对象创建过程单独抽离出来,交给工厂类负责创建。其他地方想要使用对象直接找工厂(即调用工厂的方法)获取对象。
工厂模式的三种类型
工厂模式主要有三种类型\ 1、简单工厂\ 2、工厂方法\ 3、抽象工厂
简单工厂:
拿泡茶为例,茶叶有好多种类,比如龙井、碧螺春、毛尖等。\ 首先一个ITea接口:
public interface ITea { // 沏茶 void makeTea(); }
再定义两种类型的茶,西湖龙井和碧螺春:
``` public class LongjingTea implements ITea { @Override public void makeTea() { System.out.println("西湖龙井"); } }
public class BiluochunTea implements ITea{ @Override public void makeTea() { System.out.println("碧螺春"); } } ```
简单工厂实现:
``` public class TeaFactory {
public ITea createTea(String type){
ITea tea = null;
if(type.equals("longjing")){
tea = new LongjingTea();
}else if(type.equals("biluochun")){
tea = new BiluochunTea();
}
if(tea != null){
tea.makeTea();
}
return tea;
}
} ```
测试:
``` public static void main(String[] args) {
TeaFactory teaFactory = new TeaFactory();
ITea tea = teaFactory.createTea("longjing");
}
```
工厂模式:
首先创建统一的工厂接口:
``` /** * 生产茶叶的统一接口 */ public interface ITeaFactory {
// 生产茶叶
ITea createTea();
} ```
然后创建两个生产不同类型产品的工厂实现类:
``` public class LongjingTeaFactory implements ITeaFactory{ @Override public ITea createTea() { return new LongjingTea(); } }
public class BiluochunTeaFactory implements ITeaFactory{ @Override public ITea createTea() { return new BiluochunTea(); } } ```
测试:
``` public class FactoryMethodTest { public static void main(String[] args) { ITeaFactory factory = new LongjingTeaFactory(); factory.createTea();
factory = new BiluochunTeaFactory();
factory.createTea();
}
} ```
如果要新增一种茶叶,比如毛尖,只需要新建一个生产毛尖的工厂类实现ITeaFactory即可。可以看到符合开闭原则、单一职责原则。
抽象工厂:
举例说明下,有两个工厂,美的、格力。这两个工厂都生产两种产品:冰箱和洗衣机。下面使用抽象工厂模式来描述每个工厂的两种产品的创建过程。
1、首先创建两个产品的接口类:
``` /** * 冰箱 */ public interface IFridge {
// 冷藏
void coldStorage();
}
/** * 洗衣机 */ public interface IWasher { void wash(); } ```
2、创建每个工厂的两种产品(总共四种产品):
美的的冰箱和洗衣机
``` public class MeideFridge implements IFridge{ @Override public void coldStorage() { System.out.println("美的冰箱"); } }
public class MeideWasher implements IWasher { @Override public void wash() { System.out.println("美的洗衣机"); } } ```
格力的冰箱和洗衣机
``` public class GeliFridge implements IFridge { @Override public void coldStorage() { System.out.println("格力冰箱"); } }
public class GeliWasher implements IWasher{ @Override public void wash() { System.out.println("格力洗衣机"); } } ```
3、创建抽象工厂接口
家用电器工厂,生产一组产品。
``` /** * 抽象工厂接口,家用电器工厂,生产冰箱和洗衣机 */ public interface IHouseholdElectricFactory {
IFridge createFridge();
IWasher createWasher();
} ```
4、创建具体产品等级的工厂
这里是创建美的和格力的工厂实现类。
``` public class MeideHouseholdFactory implements IHouseholdElectricFactory{ @Override public IFridge createFridge() { return new MeideFridge(); }
@Override
public IWasher createWasher() {
return new MeideWasher();
}
}
public class GeliHouseholdFactory implements IHouseholdElectricFactory{ @Override public IFridge createFridge() { return new GeliFridge(); }
@Override
public IWasher createWasher() {
return new GeliWasher();
}
} ```
测试:
``` public class AbsFactoryTest { public static void main(String[] args) {
IHouseholdElectricFactory factory = new MeideHouseholdFactory();
factory.createFridge().coldStorage();
factory.createWasher().wash();
}
} ```
工厂方法适用于以下场景:\ 1、创建对象需要大量重复的代码。\ 2、客户端(应用层)不依赖于产品类实例如何被创建、实现等细节。\ 3、一个类通过其子类来指定创建哪个对象。
工厂方法也有缺点:\ 1、类的个数容易过多,增加复杂度。\ 2、增加了系统的抽象性和理解难度。