세 가지 공장 모델 소개

간단한 공장 패턴

정의

단순 팩토리 패턴 (Simple Factory Pattern)은 생성되는 제품 인스턴스 유형을 결정하는 팩토리 객체를 나타냅니다.

생성 모드에 속하지만 GOF23 디자인 모드에는 속하지 않습니다.

해당 장면

팩토리 클래스는 더 적은 수의 객체를 생성하는 역할을하며
클라이언트는 팩토리 클래스의 매개 변수 만 전달하면되며 객체를 생성하는 방법에 대한 논리는 신경 쓰지 않아도됩니다.

이점

생성에 대한 세부 정보를 알지 못해도 필요한 객체를 얻으려면 올바른 매개 변수를 전달하기 만하면됩니다.

불리

  • 공장 분류의 책임은 상대적으로 무겁고, 신상품 추가시 공장 분류의 판단 논리 수정이 필요하여 개폐 원칙에 위배됨

  • 지나치게 복잡한 제품 구조를 확장하기 쉽지 않음

클래스 다이어그램

여기에 사진 설명 삽입

관련 코드

ICourse.java

package simpleFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/14
 * Time: 23:26
 * Description: 课程接口类
 */
public interface ICourse {
    
    
    /**
     * 录制视频
     */
    void record();
}

JavaCourse.java

package simpleFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/14
 * Time: 23:27
 * Description: No Description
 */
public class JavaCourse implements ICourse {
    
    
    public void record() {
    
    
        System.out.println("录制Java课程");
    }
}

PythonCourse.java

package simpleFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/14
 * Time: 23:29
 * Description: No Description
 */
public class PythonCourse implements ICourse{
    
    
    public void record() {
    
    
        System.out.println("录制Python课程");
    }
}

CourseFactory.java

package simpleFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/14
 * Time: 23:31
 * Description: No Description
 */
public class CourseFactory {
    
    
    public ICourse create(Class<? extends ICourse> clazz) {
    
    
        try {
    
    
            if (null != clazz) {
    
    
                return clazz.newInstance();
            }
        } catch (IllegalAccessException e) {
    
    
            e.printStackTrace();
        } catch (InstantiationException e) {
    
    
            e.printStackTrace();
        }
        return null;
    }
}

SimpleFactoryMain.java

package simpleFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/14
 * Time: 23:30
 * Description: No Description
 */
public class SimpleFactoryMain {
    
    
    public static void main(String[] args) {
    
    
        CourseFactory factory = new CourseFactory();
        ICourse javaCourse = factory.create(JavaCourse.class);
        javaCourse.record();
        ICourse pythonCourse = factory.create(PythonCourse.class);
        pythonCourse.record();
    }
}

공장 방법 패턴

정의

팩토리 메서드 패턴 (Factory Method Pattern)은 객체를 생성하기위한 인터페이스의 정의를 참조하지만이 인터페이스를 구현하는 클래스는 인스턴스화 할 클래스를 결정하고 팩토리 메서드는 클래스의 인스턴스화를 서브 클래스로 지연시킵니다.

창의적인 디자인 모델에 속함

해당 장면

  • 객체를 생성하려면 많은 반복 코드가 필요합니다.
  • 클라이언트 (응용 프로그램 계층)는 제품 클래스 인스턴스를 만들고 구현하는 방법에 대한 세부 정보에 의존하지 않습니다.
  • 클래스는 하위 클래스를 통해 생성 할 객체를 지정합니다.

이점

  • 사용자는 필요한 제품에 해당하는 공장 만 신경 쓰면되고, 생성 세부 사항은 신경 쓰지 않아도됩니다.

  • 신제품 추가는 개폐 원칙을 준수하지 않아 시스템 확장 성이 향상됩니다.

불리

  • 클래스 수가 너무 많아서 코드 구조의 복잡성이 증가합니다.
  • 추상화 및 시스템 이해의 어려움 증가

클래스 다이어그램

여기에 사진 설명 삽입여기에 사진 설명 삽입

관련 코드

IPay.java

package task;

public interface IPay {
    
    
    void pay();
}

IIPayOut.java

package task;

public interface IIPayOut extends IPay {
    
    
}

IIPayIn.java

package task;

public interface IIPayIn extends IPay {
    
    
}

기타 IPay.java

package task;

public class OtherIPay implements IIPayOut {
    
    

    public void pay() {
    
    
        System.out.println("其他国外支付");
    }
}

AppleIPay.java

package task;

public class AppleIPay implements IIPayOut {
    
    
    public void pay() {
    
    
        System.out.println("苹果支付");
    }
}

WeIPay.java

package task;

public class WeIPay implements IIPayIn {
    
    
    public void pay() {
    
    
        System.out.println("微信支付");
    }
}

UniIPay.java

package task;

public class UniIPay implements IIPayIn {
    
    
    public void pay() {
    
    
        System.out.println("银联支付");
    }
}

AliIPay.java

package task;

public class AliIPay implements IIPayIn {
    
    
    public void pay() {
    
    
        System.out.println("支付宝支付!");
    }
}

IPayFactory.java

package task;

public interface IPayFactory {
    
    
    IPay create();
}

IPayOutFactory.java

package task;

public interface IPayOutFactory extends IPayFactory{
    
    
}

IPayInFactory.java

package task;

public interface IPayInFactory extends IPayFactory{
    
    
}

OtherPayFactory.java

package task;

public class OtherPayFactory implements IPayOutFactory{
    
    
    public IIPayOut create() {
    
    
        return new OtherIPay();
    }
}

ApplePayFactory.java

package task;

public class ApplePayFactory implements IPayOutFactory{
    
    
    public IIPayOut create() {
    
    
        return new AppleIPay();
    }
}

WePayFactory.java

package task;

public class WePayFactory implements IPayInFactory{
    
    
    public IIPayIn create() {
    
    
        return new WeIPay();
    }
}

AliPayFactory.java

package task;

public class AliPayFactory implements IPayInFactory{
    
    
    public IIPayIn create() {
    
    
        return new AliIPay();
    }
}

UniPayFactory.java

package task;

public class UniPayFactory implements IPayInFactory{
    
    
    public IIPayIn create() {
    
    
        return new UniIPay();
    }
}

TaskMain.java

package task;

public class TaskMain {
    
    
    public static void main(String[] args) {
    
    
        IPayInFactory factoryIn = new AliPayFactory();
        IPay payIn = factoryIn.create();
        payIn.pay();

        IPayOutFactory factoryOut = new ApplePayFactory();
        IPay payOut = factoryOut.create();
        payOut.pay();
    }
}

추상 공장 패턴

정의

추상 팩토리 패턴 (Abastract Factory Pattern)은 특정 클래스를 지정하지 않고 일련의 관련되거나 상호 의존적 인 객체를 생성하는 인터페이스를 제공하는 것입니다.

디자인 패턴 생성

해당 장면

  • 클라이언트 (응용 프로그램 계층)는 제품 클래스 인스턴스를 만들고 구현하는 방법에 대한 세부 정보에 의존하지 않습니다.
  • 동일한 제품군에 속하는 일련의 관련 제품 객체를 함께 사용하여 많은 반복 코드가 필요한 객체를 생성한다는 점을 강조합니다.
  • 제품 클래스 라이브러리를 제공하면 모든 제품이 동일한 인터페이스로 표시되므로 클라이언트가 특정 구현에 의존하지 않습니다.

이점

  • 특정 제품은 애플리케이션 레이어 코드에서 격리되므로 생성 세부 사항에 신경 쓸 필요가 없습니다.
  • 일련의 제품군을 하나로 통합하여

불리

  • 생성 될 수있는 모든 제품군을 명시하고 있으며 제품군 내 신제품 확장이 어렵고 추상 팩토리의 인터페이스 수정이 필요함
  • 추상화 및 시스템 이해의 어려움 증가

클래스 다이어그램

여기에 사진 설명 삽입
여기에 사진 설명 삽입

관련 코드

IVideo.java

package abstractFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/17
 * Time: 14:13
 * Description: No Description
 */
public interface IVideo {
    
    
    void record();
}

JavaVideo.java

package abstractFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/17
 * Time: 14:27
 * Description: No Description
 */
public class JavaVideo implements IVideo{
    
    
    @Override
    public void record() {
    
    
        System.out.println("录制Java视频");
    }
}

PythonVideo.java

package abstractFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/17
 * Time: 14:28
 * Description: No Description
 */
public class PythonVideo implements IVideo{
    
    
    @Override
    public void record() {
    
    
        System.out.println("录制python视频");
    }
}

INote.java

package abstractFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/17
 * Time: 14:12
 * Description: No Description
 */
public interface INote {
    
    
    void edit();
}

JavaNote.java

package abstractFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/17
 * Time: 14:14
 * Description: No Description
 */
public class JavaNote implements INote {
    
    

    @Override
    public void edit() {
    
    
        System.out.println("记录Java笔记");
    }
}

PythonNote.java

package abstractFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/17
 * Time: 14:26
 * Description: No Description
 */
public class PythonNote implements INote {
    
    

    @Override
    public void edit() {
    
    
        System.out.println("记录python笔记");
    }
}

CourseFactory.java

package abstractFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/17
 * Time: 14:29
 * Description: No Description
 */
public abstract class CourseFactory {
    
    

    public void init(){
    
    
        System.out.println("初始化");
    }

    protected abstract INote createNote();

    protected abstract IVideo createVideo();
}

JavaCourseFactory.java

package abstractFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/17
 * Time: 15:21
 * Description: No Description
 */
public class JavaCourseFactory extends CourseFactory {
    
    

    public INote createNote() {
    
    
        super.init();
        return new JavaNote();
    }

    public IVideo createVideo() {
    
    
        super.init();
        return new JavaVideo();
    }
}

PythonCourseFactory.java

package abstractFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/17
 * Time: 15:21
 * Description: No Description
 */
public class PythonCourseFactory extends CourseFactory {
    
    

    public INote createNote() {
    
    
        super.init();
        return new PythonNote();
    }


    public IVideo createVideo() {
    
    
        super.init();
        return new PythonVideo();
    }
}

AbstractFactoryMain.java

package abstractFactory;

/**
 * Created with IntelliJ IDEA.
 * User: 轩辕龙儿
 * Date: 2021/3/17
 * Time: 15:22
 * Description: No Description
 */
public class AbstractFactoryMain {
    
    
    public static void main(String[] args) {
    
    

        JavaCourseFactory factory = new JavaCourseFactory();
        factory.createNote().edit();
        factory.createVideo().record();

    }
}

추천

출처blog.csdn.net/huangge1199/article/details/114933036