디자인 모델 --- 공장 방법 모델 (factory method pattern)
7635 단어 Pattern
Human. java 는 인터페이스 클래스 로 구체 적 인 코드 는 다음 과 같 습 니 다.
package com.designPattern.factoryMethod;
public interface Human {
public void laugh();
public void cry();
public void talk();
}
Human 인터페이스의 구체 적 인 실현 유형 은 다음 과 같다.
BlackHuman. java 코드 는 다음 과 같 습 니 다.
package com.designPattern.factoryMethod;
public class BlackHuman implements Human{
@Override
public void laugh() {
System.out.println(" !");
}
@Override
public void cry() {
System.out.println(" !");
}
@Override
public void talk() {
System.out.println(" !");
}
}
WhiteHuman. java 코드 는 다음 과 같 습 니 다.
package com.designPattern.factoryMethod;
public class WhiteHuman implements Human{
@Override
public void laugh() {
System.out.println(" !");
}
@Override
public void cry() {
System.out.println(" !");
}
@Override
public void talk() {
System.out.println(" !");
}
}
YellowHuman. java 코드 는 다음 과 같 습 니 다:
package com.designPattern.factoryMethod;
public class YellowHuman implements Human{
@Override
public void laugh() {
System.out.println(" !");
}
@Override
public void cry() {
System.out.println(" !");
}
@Override
public void talk() {
System.out.println(" !");
}
}
공장 류 HumanFactory. java 코드 는 다음 과 같 습 니 다.
package com.designPattern.factoryMethod;
import java.util.List;
import java.util.Random;
public class HumanFactory {
public static Human createHuman(Class c){
Human human = null;
try{
human = (Human)Class.forName(c.getName()).newInstance();
}catch(Exception e){
e.printStackTrace();
}
return human;
}
public static Human createHuman(){
Human human = null;
List<Class> concreteHumanList = ClassUtils.getAllClassByInterface(Human.class);
Random random = new Random();
int rand = random.nextInt(concreteHumanList.size());
human = createHuman(concreteHumanList.get(rand));
return human;
}
}
공장 클래스 에 사용 되 는 도구 클래스 ClassUtils. java 코드 는 다음 과 같 습 니 다.
package com.designPattern.factoryMethod;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
public class ClassUtils {
@SuppressWarnings("rawtypes")
public static List<Class> getAllClassByInterface(Class c){
List<Class> returnClassList = new ArrayList<Class>();
if(c.isInterface()){
String packageName = c.getPackage().getName();
try{
List<Class> allClass = getClasses(packageName);
for(int i=0;i<allClass.size();i++){
//isAssignableFrom
// if Human
if(c.isAssignableFrom(allClass.get(i))){
if(!c.equals(allClass.get(i))){
returnClassList.add(allClass.get(i));
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
return returnClassList;
}
private static List<Class> getClasses(String packageName) throws ClassNotFoundException,IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
String path = packageName.replace('.', '/');
// : path , %20,
Enumeration<URL> resources = classLoader.getResources(path);
List<File> dirs = new ArrayList<File>();
while(resources.hasMoreElements()){
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
ArrayList<Class> classes = new ArrayList<Class>();
for(File directory:dirs){
classes.addAll(findClasses(directory,packageName));
}
return classes;
}
private static List<Class> findClasses(File directory,String packageName) throws ClassNotFoundException{
List<Class> classes = new ArrayList<Class>();
if(!directory.exists()){
return classes;
}
File[] files = directory.listFiles();
for(File file:files){
if( file.isDirectory()){
assert !file.getName().contains(".");
classes.addAll(findClasses(file, packageName+"."+file.getName()));
}else if(file.getName().endsWith(".class")){
classes.add(Class.forName(packageName+'.'+file.getName().substring(0, file.getName().length()-6)));
}
}
return classes;
}
}
공장 클래스 의 호출 클래스 NvWa. java 코드 는 다음 과 같 습 니 다.
package com.designPattern.factoryMethod;
public class NvWa {
public static void main(String[] args) throws Exception{
System.out.println("---------------- : ---------------------");
Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);
whiteHuman.laugh();
whiteHuman.cry();
whiteHuman.talk();
System.out.println("---------------- : ---------------------");
Human blackHuman = HumanFactory.createHuman(BlackHuman.class);
blackHuman.laugh();
blackHuman.cry();
blackHuman.talk();
System.out.println("---------------- : ---------------------");
Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);
yellowHuman.laugh();
yellowHuman.cry();
yellowHuman.talk();
for(int i=0;i<10;i++){
System.out.println(" ");
Human human = HumanFactory.createHuman();
human.cry();
human.laugh();
human.talk();
}
}
}
실행 결 과 는 다음 과 같 습 니 다.
---------------- : ---------------------
!
!
!
---------------- : ---------------------
!
!
!
---------------- : ---------------------
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
문자열을 날짜 대상으로 변환하기 (각도를 바꾸어 코드를 쓰기)/** * 日期模式定义. */ var GlobalDatePattern = [ { pattern: "yyyy-MM-dd HH:mm:ss", fix: { year: 0, month: 1, day: 2, hour: 3, ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.