简单工厂
This commit is contained in:
@@ -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();
|
||||||
|
}
|
||||||
@@ -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视频");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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视频");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user