java创建榨汁机_java设计模式(二)——工厂模式

1、基本概念

工厂模式属于创造型模式,对象不再用户去调用,而是交由工厂去创建。

例如:我们想要吃烤鸭,如果自己做的话,那么需要买鸭,处理鸭,烤,放作料等一些列过程。

而如果我们去餐厅去买的话,我们就不需要关心怎么去做的,由饭店给我们做,它给我们做好的鸭子即可。

2、工厂类型

工厂模式属于创造型的模式,三种形式:简单工厂,工厂方法,抽象工厂,

每种工厂都有它的优缺点,看合适的场景去使用。

2.1、简单工厂

适用于创建对象少,不经常变,用户无需在意对象的创建过程,简单容易理解。

案例:

类图:

afe045300282bd45ba49f896e10db33e.png

接口: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、工厂方法

上面的简单工厂虽然用法简单,但不利于扩展。当我们新增一个语文课时,我们需要修改简单工厂的代码,这不符合开闭原则,而且当

简单工厂创建的对象经常改变,种类繁多时,也就不符合单一职责。这时候工厂方法就有了,它符合开闭原则,职能单一原则。

创建的对象多,让系统代码结构更为复杂。

案例:

类图:

29187edb48d9f60175c7254bd34502ca.png

课程接口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、抽象工厂

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,适用于产品族

缺点:结构较复杂,理解难度大,当工厂新增一个产品时,需要修改工厂的方法,不符合开闭原则。

案例:现有三个工厂类:小米工厂,格力工厂,美的工厂

小米工厂:生产空调,洗衣机,榨汁机,这三个就可以是一个产品族了

格力工厂:生产空调,洗衣机,榨汁机

美的工厂:生产空调,洗衣机,榨汁机

抽象工厂:定义三个抽象方法

类图:

614dddeeb0ebb3157e69d017f3cd5f88.png

抽象工厂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();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值