工厂模式
工厂模式分为简单工厂、工厂方法、抽象工厂,属于创建型设计模式。工厂模式的特点是将创建产品对象的过程通过工厂包装起来,客户端只需要调用,不需要关系产品创建的细节。
- 简单工厂模式:指由一个工厂对象决定创建哪一种产品的对象,不属于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();
}
}