2_工厂设计_工厂方法和抽象工厂

工厂设计模式-工厂方法

1.概念

工厂方法模式(Fatory Method Pattern ) 是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类工厂方法让类的实例化推迟到子类中进行。

在工厂方法模式中用户只需要关心所需产品对应的工厂,无须关心创建细节。

2.案例说明和分析

2.1 定义一个创建对象的接口

public interface ICourse {
    void record(); //录制抽象功能
}
public class JavaCourse implements ICourse {
    public void record() {
        System.out.println("录制Java课程");
    }
}
public class PythonCourse implements ICourse {
    public void record() {
        System.out.println("录制Python课程");
    }
}

/** 工厂模型 */
public interface ICourseFactory {
    ICourse create();
}

2.2 定义接口和实现类

public class JavaCourseFactory implements ICourseFactory {
    public ICourse create() {
        return new JavaCourse();
    }
}
public class PythonCourseFactory implements ICourseFactory {
    public ICourse create() {
        return new PythonCourse();
    }
}

2.3实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。

public class FactoryMethodTest {
    public static void main(String[] args) {
        ICourseFactory factory = new PythonCourseFactory();
        ICourse course = factory.create();
        course.record();
        factory = new JavaCourseFactory();
        course = factory.create();
        course.record();
    }
}

2.4 类图

2_工厂设计_工厂方法和抽象工厂_第1张图片

3.总结

使用步骤:

创建一个接口A(实现抽象接口功能名write() )和实现类AImpl(实现逻辑代码:writ(){…})。

在创建创建一个接口工厂B(实现抽象功能返回接口A对象: creatA();)和实现类BImpl(实现逻辑返回AImpl实现类对象:createA(){ return new AImpl();})。

创建一个调用类 -> B b = new BImpl(); A a = b.createA(); a.write();

代码实现:

public interface A {
    void write(); 
}
//业务实现逻辑
public class AImpl implements A {
    public void write() {
        //不依赖于产品类实例如何被创建、实现等细节 
        System.out.println("写Java作业");
    }
}

//-------------------------------
public interface B {
     A createA();
}
public class BImpl implements B {
    public A createA() {
        //创建对象需要大量重复的代码
        return new AImpl(); //一个类通过其子类来指定创建哪个对象;
    }
}

B b = new BImpl();
A a = b.createA();
a.write();

为什么要使用工厂方法了啊?解决什么问题。

  1. 创建对象需要大量重复的代码;
  2. 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节 ;
  3. 一个类通过其子类来指定创建哪个对象;

工厂方法也有缺点

  1. 类的个数容易过多,增加复杂度
  2. 增加了系统的抽象性和理解难度

工厂设计模式-抽象工厂

1.案例说明和分析

//步骤1:创建接口和实现类
public interface ICourse {
    /* 录制视频 */
    void record();
}
public class JavaCourse implements ICourse {
    public void record() {
        System.out.println("录制Java课程");
    }
}
//多个....


// 步骤2: 创建抽象工厂类,并创建抽象方法返回实现类对象(接口对象)
public abstract class CourseFactory {
    public void init(){
        System.out.println("初始化基础数据");
    }
    protected abstract ICourse createCourse();
    
    //(都属于同一组的产品(小米空调,小米电视,小米手机)之间有一些联系) 多个....
}



//步骤3:继承抽象类工厂并实现抽象方法(创建实现类并返回)
public class JavaCourseFactory extends CourseFactory {
    public ICourse createCourse() {
        super.init();
        return new JavaCourse();
    }
}
//多个....


// 步骤4:创建继承抽象类的实例对象,并调用实现类中的业务逻辑方法
public class AbstractFactoryTest {
    public static void main(String[] args) {
        //一起使用创建对象需要大量重复的代码,这里就解决了。
        CourseFactory factory = new JavaCourseFactory();
        factory.createCourse().record();
        //多个...
    }
}

2.类图

2_工厂设计_工厂方法和抽象工厂_第2张图片

3.总结

3.1 创建步骤:

  • 步骤1:创建接口和实现类
  • 步骤2: 创建抽象工厂类,并创建抽象方法返回实现类对象(接口对象)
  • 步骤3:继承抽象类工厂并实现抽象方法(创建实现类并返回)
  • 步骤4:创建继承抽象类的实例对象,并调用实现类中的业务逻辑方法

3.2 使用理解

强调的是系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。

同一产品结构下还有格力热水器,格力空调,格力洗衣机。

2_工厂设计_工厂方法和抽象工厂_第3张图片

2_工厂设计_工厂方法和抽象工厂_第4张图片

3.3使用场景

如需要创建小米品牌一组家电(电视,空调,电饭锅等等)的对象,一个一个创建代码过多而且创建过程过程复杂,这时可以用抽象工厂方法封装一起来,调用就会变得简单。

如果创建多种品牌家电,每种品牌等级和价格不同,这时候就使用抽象工厂方法封装,传入什么参数调用什么等级家电产品,返回一组家电对象

参考:
https://refactoringguru.cn/design-patterns/factory-method
https://www.yuque.com/huangjinshidai-1wt9t/ocmvo8/zr4ypvhosvzzmh24?singleDoc#

你可能感兴趣的:(java_设计模式,抽象工厂模式,工厂方法模式)