파일 구조
//Factory.java
package framework;
public abstract class Factory{
public Product create(String company, String resolution){
Product p = createProduct(company, resolution);
registerProduct(p);
return p;
}
public abstract Product createProduct(String company, String resolution);
public abstract void registerProduct(Product product);
}
이전의 템플릿 패턴과 같이 create를 통해서 큰 흐름은 정해놓고 abstract 메소드들의 구체화를 통해 실행되는 결과가 다릅니다.
// Factory를 상속받은 클래스
package tv;
import java.util.*;
import framework.*;
public class tvFactory extends Factory{
private List <tv> owners = new ArrayList();
public Product createProduct(String company, String resolution){
return new tv(company, resolution);
}
public void registerProduct(Product product){
owners.add((tv)product);
}
public List getOwners(){
return owners;
}
}
추상 메소드 들을 구현해주고 있다. createProduct를 보면 객체를 만들어서 반환해주고 있다. 원래 Main문에서 만들어질 것이었는데 메인으로 부터 떨어짐으로써 결합도가 낮아졌고 main 만을 보고서 안이 어떻게 만들어 졌는지 꼭 숨킬 수 있었다.
//Product
package framework;
public abstract class Product{
public abstract void getTvInfo();
}
우리가 만들 객체를 추상화하고 있다.
//Product를 상속 받은 클래스
package tv;
import framework.*;
import java.util.*;
public class tv extends Product{
private String company;
private String resolution;
public tv(String company, String resolution){
this.company = company;
this.resolution = resolution;
System.out.println(company+"회사의 "+resolution+"화질로 tv가 만들어졌습니다.");
}
public void getTvInfo(){
System.out.println(this.company + "회사의 "+ this.resolution+"화질인 제품입니다.");
}
}
//Main
import framework.*;
import tv.*;
public class Main{
public static void main(String[] args){
Factory factory = new tvFactory();
Product card1 = factory.create("LG", "FullHD");
Product card2 = factory.create("SamSung", "UHD");
Product card3 = factory.create("LG", "8K");
card1.getTvInfo();
card2.getTvInfo();
card3.getTvInfo();
}
}
//결과
//디렉터리 구조
//Factory
export default class Factory{
constructor(){}
createProduct(compnay, resoluation){}
registerProduct(product){}
create(compnay, resoluation){
const p = this.createProduct(compnay, resoluation);
this.registerProduct(p);
return p;
}
}
//TvFactory
import Factory from "./Factory";
import TvProduct from "./TvProduct";
export default class TvFactory extends Factory{
constructor(){
super();
this.tvs = new Array();
}
createProduct(compnay, resoluation){
return new TvProduct(compnay, resoluation);
}
registerProduct(product){
this.tvs.push(product);
}
}
//Product
export default class Product{
constructor(){}
getInfo(){}
}
//TvProduct (Product를 상속한 클래스)
import Product from "./Product";
export default class TvProduct extends Product{
constructor(compnay, resoluation){
super();
this.compnay = compnay;
this.resoluation = resoluation;
console.log(`${this.compnay}에서 ${this.resoluation}화질의 제품이 제작되었습니다.`);
}
getInfo(){
console.log(`${this.compnay}에서 만든 ${this.resoluation}화질의 제품입니다.`);
}
}
//index.js
import TvFactory from "./TvFactory";
const factory = new TvFactory();
const tv1 = factory.create("LG", "4k");
const tv2 = factory.create("Samsung", "8k");
const tv3 = factory.create("LG", "FullHd");
tv1.getInfo();
tv2.getInfo();
tv3.getInfo();
//결과
es6의 코드가 조금 쓰였는데 실행시키고 싶다면 babel을 통해서 설정해주어야합니다.
[javascript/node.js] - node.js에서 es6 코드 사용해보기(babel)
자바스크립트는 자바와 달리 abstract 클래스와 메소드를 만들지 못해서 상위 클래스에 함수를 선언만 해놓는 방식으로 abstract같은 효과를 냈습니다.
자바스크립트도 자바와 같이 바로 선언 해주지 않고 서브클래스에 선언 해줌으로 서 결합도를 낮추어 주었습니다.
디렉토리 구조
//Factory
import abc
class Factory:
__metaclass__ = abc.ABCMeta
def create(self, company, quality):
p = self.createProduct(company, quality)
self.registProduct(p)
return p
@abc.abstractmethod
def createProduct(self, company, quality):
pass
@abc.abstractmethod
def registProduct(self, product):
pass
//TvFactory
from Factory import Factory
from TvProduct import TvProduct
class TvFactory(Factory):
def __init__(self):
self.tvs = []
def createProduct(self, company, quality):
return TvProduct(company, quality)
def registProduct(self, product):
self.tvs.append(product)
//Product
import abc
class Product:
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def getInfo(self):
pass
//TvProduct
from Product import Product
class TvProduct(Product):
def __init__(self, company, quality):
self.company = company
self.quality = quality
print(company+"회사의 "+quality+"화질로 tv가 만들어졌습니다.")
def getInfo(self):
print(self.company + "회사의 "+ self.quality+"화질인 제품입니다.")
//main
from TvFactory import TvFactory
if __name__ == "__main__":
tvFactory = TvFactory()
tv1 = tvFactory.create("SamSung", "FullHD")
tv2 = tvFactory.create("LG", "8k")
tv3 = tvFactory.create("Sony", "4k")
tv1.getInfo()
tv2.getInfo()
tv3.getInfo()
//결과