세 가지 공장 모델
간단한 공장 패턴
정의
단순 팩토리 패턴 (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();
}
}