设计模式之工厂模式

工厂模式

工厂模式分为简单工厂、工厂方法、抽象工厂,属于创建型设计模式。工厂模式的特点是将创建产品对象的过程通过工厂包装起来,客户端只需要调用,不需要关系产品创建的细节。

  • 简单工厂模式:指由一个工厂对象决定创建哪一种产品的对象,不属于GOF23种设计模式。适用于创建对象较少的场景,且客户端需要传入工厂的参数。
  • 工厂方法模式:定义一个创建对象的接口,让实现这个接口的类,来决定实例那个产品对象。工厂方法让类的实例化推迟到子类中进行,工厂方法模式中只需要关心使用哪个产品的工厂,不需要关心产品对象的创建细节,且加入新的产品符合开闭原则。
  • 抽象工厂:提供一个创建一系列相关产品对象的接口,无需指定具体的实现类。客户端不依赖于产品如何创建的细节,强调的是一系列相关产品的对象(同一产品族)的创建需要大量重复代码。

简单工厂模式

适用于产品对象较少,且创建对象的逻辑不复杂。
产品接口

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: ICourse
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:39
 */
public interface ICourse {
    void record();
}

产品实现

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: JavaCourse
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:40
 */
public class JavaCourse implements ICourse{

    @Override
    public void record() {
        System.out.println("java course record");
    }
}

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: PythonCourse
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:41
 */
public class PythonCourse implements ICourse{
    @Override
    public void record() {
        System.out.println("pyhtonCourse record");
    }
}

工厂

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: CourseFactory
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:41
 */
public class CourseFactory {
    public static ICourse creatCourse(Class<? extends ICourse> clas){
        if (clas!=null){
            try {
                return clas.newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

客户端使用

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: Test1
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:44
 */
public class Test1 {
    public static void main(String[] args) {
        ICourse iCourse=CourseFactory.creatCourse(JavaCourse.class);
        iCourse.record();
        ICourse iCourse2=CourseFactory.creatCourse(PythonCourse.class);
        iCourse2.record();

    }
}

工厂方法模式

如果所需要创建的对象太多,且有自己的逻辑,按照职责单一原则,避免工厂类过于臃肿,将逻辑拆分出来,每个产品类的对象由对应的工厂来实现。

适用场景:

  • 创建对象需要大量的重复代码。
  • 客户端不依赖于产品实例如何被创建,不依赖于实现细节。

缺点:

  • 工厂类的个数过多,增加编码的复杂性。
  • 增加系统的复杂度,代表不易读。

产品接口及产品实现和简单工厂一样,不再说明。

增加工厂接口

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: ICourseFactory
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:55
 */
public interface ICourseFactory {
    ICourse createCourse();
}

产品的工厂实现类

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: CourseFactory2
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:56
 */
public class JavaCourseFactory implements ICourseFactory{
    @Override
    public ICourse createCourse() {
        return new JavaCourse();
    }
}

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: PythonCourseFactory
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:57
 */
public class PythonCourseFactory implements ICourseFactory {
    @Override
    public ICourse createCourse() {
        return new PythonCourse();
    }
}

客户端使用

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: Test1
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:44
 */
public class Test1 {
    public static void main(String[] args) {
//        ICourse iCourse=CourseFactory.creatCourse(JavaCourse.class);
//        iCourse.record();
//        ICourse iCourse2=CourseFactory.creatCourse(PythonCourse.class);
//        iCourse2.record();
        ICourseFactory factory1=new JavaCourseFactory();
        factory1.createCourse().record();
        ICourseFactory factory2=new PythonCourseFactory();
        factory2.createCourse().record();

    }
}

抽象工厂

在这里插入图片描述
例如正方形是洗衣机,圆形是电冰箱,菱形是热水器,同一个产品族用一个工厂,即美的的工厂生产美的的洗衣机、电冰箱、热水器。

定义洗衣机、电冰箱、热水器的产品接口

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: Washmachine
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:29
 */
public interface Washmachine {
    void work();
}


package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: Refrigerator
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:30
 */
public interface Refrigerator {
    void work();
}

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: Water
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:30
 */
public interface Water {
    void work();

}


美的的产品实现

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: MediaWashmachine
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:36
 */
public class MediaWashmachine implements Washmachine{
    @Override
    public void work() {
        System.out.println("美的洗衣机work");
    }
}

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: MediaRefrigerator
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:34
 */
public class MediaRefrigerator implements Refrigerator {
    @Override
    public void work() {
        System.out.println("美的电冰箱work");
    }
}
package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: MediaWater
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:32
 */
public class MediaWater implements Water {
    @Override
    public void work() {
        System.out.println("美的热水器work");
    }
}

海尔的产品实现

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: HaierWashMachine
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:37
 */
public class HaierWashMachine implements Washmachine{
    @Override
    public void work() {
        System.out.println("海尔洗衣机work");
    }
}
package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: HaierRefrigerator
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:35
 */
public class HaierRefrigerator implements Refrigerator {
    @Override
    public void work() {
        System.out.println("海尔电冰箱work");
    }
}
package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: HaierWater
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:33
 */
public class HaierWater implements Water {
    @Override
    public void work() {
        System.out.println("海尔热水器work");
    }
}


电器工厂抽象类

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: ElectricalFactory
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:38
 */
public abstract class ElectricalFactory {
    abstract Washmachine createWashMachine();
    abstract Refrigerator crateRefrigerator();
    abstract Water createWater();
}

美的工厂

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: MediaFactory
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:41
 */
public class MediaFactory extends ElectricalFactory {
    @Override
    Washmachine createWashMachine() {
        return new MediaWashmachine();
    }

    @Override
    Refrigerator crateRefrigerator() {
        return new MediaRefrigerator();
    }

    @Override
    Water createWater() {
        return new MediaWater();
    }
}

海尔工厂

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: HaierFactory
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/114:42
 */
public class HaierFactory extends ElectricalFactory{
    @Override
    Washmachine createWashMachine() {
        return new HaierWashMachine();
    }

    @Override
    Refrigerator crateRefrigerator() {
        return new HaierRefrigerator();
    }

    @Override
    Water createWater() {
        return new HaierWater();
    }
}

客户端使用

package com.example.proxy.designpatten.gupaogongchang;

/**
 * @author ludengke
 * @title: Test1
 * @projectName alibabatest
 * @description: TODO
 * @date 2024/6/113:44
 */
public class Test1 {
    public static void main(String[] args) {
//        ICourse iCourse=CourseFactory.creatCourse(JavaCourse.class);
//        iCourse.record();
//        ICourse iCourse2=CourseFactory.creatCourse(PythonCourse.class);
//        iCourse2.record();
//        ICourseFactory factory1=new JavaCourseFactory();
//        factory1.createCourse().record();
//        ICourseFactory factory2=new PythonCourseFactory();
//        factory2.createCourse().record();
        ElectricalFactory electricalFactory =new MediaFactory();
        electricalFactory.crateRefrigerator().work();
        electricalFactory.createWashMachine().work();
        electricalFactory.createWater().work();

        ElectricalFactory electricalFactory1=new HaierFactory();
        electricalFactory1.crateRefrigerator().work();
        electricalFactory1.createWashMachine().work();
        electricalFactory1.createWater().work();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值