1、基本概念
工厂模式属于创造型模式,对象不再用户去调用,而是交由工厂去创建。
例如:我们想要吃烤鸭,如果自己做的话,那么需要买鸭,处理鸭,烤,放作料等一些列过程。
而如果我们去餐厅去买的话,我们就不需要关心怎么去做的,由饭店给我们做,它给我们做好的鸭子即可。
2、工厂类型
工厂模式属于创造型的模式,三种形式:简单工厂,工厂方法,抽象工厂,
每种工厂都有它的优缺点,看合适的场景去使用。
2.1、简单工厂
适用于创建对象少,不经常变,用户无需在意对象的创建过程,简单容易理解。
案例:
类图:
接口:Icource
/*** @date 2020/6/30*/
public interfaceIcource {//备课
voidprepareCource();//教学
voidteach();//批改作业
voidcorrectiveWork();
}
实现类:MathCource
/*** @date 2020/6/30*/
public class MathCource implementsIcource {
@Overridepublic voidprepareCource() {
System.out.println("备数学课");
}
@Overridepublic voidteach() {
System.out.println("数学教学");
}
@Overridepublic voidcorrectiveWork() {
System.out.println("批改数学作业");
}
}
实现类:EnglishCource
/*** @date 2020/6/30*/
public class EnglishCource implementsIcource {
@Overridepublic voidprepareCource() {
System.out.println("备英语课");
}
@Overridepublic voidteach() {
System.out.println("英语教学");
}
@Overridepublic voidcorrectiveWork() {
System.out.println("批改英语作业");
}
}
简单工厂:
/*** @date 2020/6/30*/
public classCourceSimpleFactory {public staticIcource createCource(String type){
Icource icource= null;if("math".equals(type)){
icource= newMathCource();
}else if("english".equals(type)){
icource= newEnglishCource();
}returnicource;
}
}
测试类:
/*** @date 2020/6/30*/
public classTest {public static voidmain(String[] args) {
Icource icource= CourceSimpleFactory.createCource("math");
icource.prepareCource();
icource.teach();
icource.correctiveWork();
}
}
2.2、工厂方法
上面的简单工厂虽然用法简单,但不利于扩展。当我们新增一个语文课时,我们需要修改简单工厂的代码,这不符合开闭原则,而且当
简单工厂创建的对象经常改变,种类繁多时,也就不符合单一职责。这时候工厂方法就有了,它符合开闭原则,职能单一原则。
创建的对象多,让系统代码结构更为复杂。
案例:
类图:
课程接口Icource :
/*** @date 2020/6/30*/
public interfaceIcource {//备课
voidprepareCource();//教学
voidteach();//批改作业
voidcorrectiveWork();
}
实现类MathCource :
/*** @date 2020/6/30*/
public class MathCource implementsIcource {
@Overridepublic voidprepareCource() {
System.out.println("备数学课");
}
@Overridepublic voidteach() {
System.out.println("数学教学");
}
@Overridepublic voidcorrectiveWork() {
System.out.println("批改数学作业");
}
}
实现类EnglishCource :
/*** @date 2020/6/30*/
public class EnglishCource implementsIcource {
@Overridepublic voidprepareCource() {
System.out.println("备英语课");
}
@Overridepublic voidteach() {
System.out.println("英语教学");
}
@Overridepublic voidcorrectiveWork() {
System.out.println("批改英语作业");
}
}
工厂接口IcourceFactory :
/*** @date 2020/6/30*/
public interfaceIcourceFactory {
Icource createInstance();
}
实现工厂接口类EnglishFactory :
/*** @date 2020/6/30*/
public class EnglishFactory implementsIcourceFactory{
@OverridepublicIcource createInstance() {return newEnglishCource();
}
}
实现工厂接口类:MathFacotry
/*** @date 2020/6/30*/
public class MathFacotry implementsIcourceFactory {
@OverridepublicIcource createInstance() {return newMathCource();
}
}
测试类:
/*** @date 2020/6/30*/
public classTest {public static voidmain(String[] args) {
IcourceFactory icourceFactory= newEnglishFactory();
Icource instance=icourceFactory.createInstance();
instance.correctiveWork();
}
}
2.3、抽象工厂
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,适用于产品族
缺点:结构较复杂,理解难度大,当工厂新增一个产品时,需要修改工厂的方法,不符合开闭原则。
案例:现有三个工厂类:小米工厂,格力工厂,美的工厂
小米工厂:生产空调,洗衣机,榨汁机,这三个就可以是一个产品族了
格力工厂:生产空调,洗衣机,榨汁机
美的工厂:生产空调,洗衣机,榨汁机
抽象工厂:定义三个抽象方法
类图:
抽象工厂AbstractFactory :
/*** @date 2020/6/30*/
public abstract classAbstractFactory {protected abstractIAirConditioning createAirConditioning();protected abstractIJuicer createJuicer();protected abstractIWashingMachine createWashingMachine();
}
抽象工厂继承类XiaomiFactory :
/*** @date 2020/6/30*/
public class XiaomiFactory extendsAbstractFactory {
@OverrideprotectedIAirConditioning createAirConditioning() {return newXiaomiAirConditioning();
}
@OverrideprotectedIJuicer createJuicer() {return newXiaomiJuicer();
}
@OverrideprotectedIWashingMachine createWashingMachine() {return newXiaomiWashingMachine();
}
}
抽象工厂继承类MideaFactory:
/*** @date 2020/6/30*/
public class MideaFactory extendsAbstractFactory {
@OverrideprotectedIAirConditioning createAirConditioning() {return newMideaAirConditioning();
}
@OverrideprotectedIJuicer createJuicer() {return newMideaJuicer();
}
@OverrideprotectedIWashingMachine createWashingMachine() {return newMideaWashingMachine();
}
}
抽象工厂继承类GreenFactory:
/*** @date 2020/6/30*/
public class GreenFactory extendsAbstractFactory {
@OverrideprotectedIAirConditioning createAirConditioning() {return newGreenAirConditioning();
}
@OverrideprotectedIJuicer createJuicer() {return newGreenJuicer();
}
@OverrideprotectedIWashingMachine createWashingMachine() {return newGreenWashingMachine();
}
}
空调接口IAirConditioning :
/*** @date 2020/6/30*/
public interfaceIAirConditioning {voidrefrigeration();
}
其实现类XiaomiAirConditioning :
/*** @date 2020/6/30*/
public class XiaomiAirConditioning implementsIAirConditioning {
@Overridepublic voidrefrigeration() {
System.out.println("小米空调");
}
}
其实现类MideaAirConditioning :
/*** @date 2020/6/30*/
public class MideaAirConditioning implementsIAirConditioning {
@Overridepublic voidrefrigeration() {
System.out.println("美的空调");
}
}
其实现类GreenAirConditioning :
/*** @date 2020/6/30*/
public class GreenAirConditioning implementsIAirConditioning {
@Overridepublic voidrefrigeration() {
System.out.println("格力空调");
}
}
洗衣机接口IWashingMachine :
/*** @date 2020/6/30*/
public interfaceIWashingMachine {voidwashClothes();
}
其实现类XiaomiWashingMachine :
/*** @date 2020/6/30*/
public class XiaomiWashingMachine implementsIWashingMachine {
@Overridepublic voidwashClothes() {
System.out.println("小米洗衣机");
}
}
其实现类MideaWashingMachine :
/*** @date 2020/6/30*/
public class MideaWashingMachine implementsIWashingMachine {
@Overridepublic voidwashClothes() {
System.out.println("美的洗衣机");
}
}
其实现类GreenWashingMachine :
/*** @date 2020/6/30*/
public class GreenWashingMachine implementsIWashingMachine {
@Overridepublic voidwashClothes() {
System.out.println("格力洗衣机");
}
}
榨汁机接口IJuicer :
/*** @date 2020/6/30*/
public interfaceIJuicer {voidjuicing();
}
其实现类XiaomiJuicer :
/*** @date 2020/6/30*/
public class XiaomiJuicer implementsIJuicer {
@Overridepublic voidjuicing() {
System.out.println("小米榨汁机");
}
}
其实现类MideaJuicer :
/*** @date 2020/6/30*/
public class MideaJuicer implementsIJuicer {
@Overridepublic voidjuicing() {
System.out.println("美的空调");
}
}
其实现类MideaJuicer :
/*** @date 2020/6/30*/
public class GreenJuicer implementsIJuicer {
@Overridepublic voidjuicing() {
System.out.println("格力榨汁机");
}
}
其实现类GreenJuicer :
/*** @date 2020/6/30*/
public class GreenJuicer implementsIJuicer {
@Overridepublic voidjuicing() {
System.out.println("格力榨汁机");
}
}
测试类:
/*** @date 2020/6/30*/
public classTest {public static voidmain(String[] args) {
AbstractFactory factory= newGreenFactory();
factory.createAirConditioning().refrigeration();
}
}