工厂方法

This commit is contained in:
2018-09-23 22:42:40 +08:00
parent f82e1330dd
commit 739e9e0b5e
7 changed files with 102 additions and 0 deletions

View File

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

View File

@@ -0,0 +1,21 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod;
import sun.misc.Launcher;
import java.util.Collection;
/**
* 定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中
* 工厂方法抽象类,只提供契约,对于已知的逻辑可以提供默认实现
* <p>
* 提高产品与产品族的拓展性
* <p>
* JDK源码样例1{@link java.net.URLStreamHandlerFactory#createURLStreamHandler(String)} -> {@link Launcher.Factory#createURLStreamHandler(String)}
* JDK源码样例2{@link Collection#iterator()}
*
* @author F嘉阳
* @date 2018-09-23 16:16
*/
public abstract class AbstractVideoFactory {
public abstract AbstractVideo getVideo();
}

View File

@@ -0,0 +1,12 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod;
/**
* @author F嘉阳
* @date 2018-09-23 20:11
*/
public class JavaAbstractVideoFactory extends AbstractVideoFactory {
@Override
public AbstractVideo getVideo() {
return new JavaVideo();
}
}

View File

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

View File

@@ -0,0 +1,12 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod;
/**
* @author F嘉阳
* @date 2018-09-23 20:11
*/
public class PythonAbstractVideoFactory extends AbstractVideoFactory {
@Override
public AbstractVideo getVideo() {
return new PythonVideo();
}
}

View File

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

View File

@@ -0,0 +1,12 @@
package top.fjy8018.designpattern.pattern.creational.factorymethod;
import org.junit.jupiter.api.Test;
class AbstractVideoFactoryTest {
@Test
void getVideo() {
AbstractVideoFactory factory = new JavaAbstractVideoFactory();
factory.getVideo().produce();
}
}