简单工厂

This commit is contained in:
2018-09-23 16:33:59 +08:00
parent f021174da8
commit bcb84ad34d
5 changed files with 120 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
package top.fjy8018.designpattern.pattern.creational.simplefactory;
/**
* 简单工厂
*
* @author F嘉阳
* @date 2018-09-23 16:13
*/
public abstract class AbstractVideo {
public abstract void produce();
}

View File

@@ -0,0 +1,15 @@
package top.fjy8018.designpattern.pattern.creational.simplefactory;
import lombok.extern.slf4j.Slf4j;
/**
* @author F嘉阳
* @date 2018-09-23 16:13
*/
@Slf4j
public class JavaAbstractVideo extends AbstractVideo {
@Override
public void produce() {
log.info("生产Java视频");
}
}

View File

@@ -0,0 +1,15 @@
package top.fjy8018.designpattern.pattern.creational.simplefactory;
import lombok.extern.slf4j.Slf4j;
/**
* @author F嘉阳
* @date 2018-09-23 16:14
*/
@Slf4j
public class PythonAbstractVideo extends AbstractVideo {
@Override
public void produce() {
log.info("生产Python视频");
}
}

View File

@@ -0,0 +1,42 @@
package top.fjy8018.designpattern.pattern.creational.simplefactory;
/**
* @author F嘉阳
* @date 2018-09-23 16:16
*/
public class VideoFactory {
/**
* 由工厂负责创建类,业务层无需关心具体实现
* 其缺点是不符合开闭原则,即如果具体实现类扩展后,工厂类也必须修改
*
* @param type
* @return
*/
public AbstractVideo getVideo(String type) {
switch (type) {
case "Java":
return new JavaAbstractVideo();
case "Python":
return new PythonAbstractVideo();
default:
return null;
}
}
/**
* 通过反射在一定程度弥补简单工厂不足(开闭原则)
*
* @param c
* @return
*/
public AbstractVideo getVideo(Class c) {
AbstractVideo video = null;
try {
video = (AbstractVideo) Class.forName(c.getName()).newInstance();
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
return video;
}
}

View File

@@ -0,0 +1,37 @@
package top.fjy8018.designpattern.pattern.creational.simplefactory;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class AbstractVideoTest {
/**
* 不使用简单工厂,则业务层需要引入具体的实现类
*/
@Test
void before() {
AbstractVideo video = new JavaAbstractVideo();
video.produce();
}
/**
* 使用简单工厂后业务层无需导入具体的实现类,即不关心具体实现过程
*/
@Test
void after() {
VideoFactory factory = new VideoFactory();
AbstractVideo video = factory.getVideo("Java");
video.produce();
}
/**
* 通过传递类名方式改进扩展性问题
*/
@Test
void improve() {
VideoFactory factory = new VideoFactory();
AbstractVideo video = factory.getVideo(JavaAbstractVideo.class);
video.produce();
}
}