publicabstractclassCarFactory {
publicabstract Car createCar(String name); // add - onpublicabstract Car returnMyCar(String name);
}
class diagram 에서 Creator 에 해당된다.
publicclassHyundaiFactoryextendsCarFactory{
HashMap<String, Car> carMap = new HashMap<String, Car>();
@Overridepublic Car createCar(String name) {
Car car = null;
if (name == "sonata") {
car = new Sonata();
}
elseif( name == "santafe") {
car = new Santafe();
}
return car;
}
@Overridepublic Car returnMyCar(String name) {
// Jame는 Sonata, Tomas는 Santafe 인 경우
Car myCar = carMap.get(name);
if(myCar == null) {
if(name.equals("James")){
myCar = new Sonata();
}
elseif(name.equals("Tomas") ){
myCar = new Santafe();
}
carMap.put(name, myCar);
}
return myCar;
}
}
class diagram 에서 ConcreteCreator 에 해당된다.
returnCar 메서드 처럼 인스턴스를 생성하는 것 뿐 아니라 관리해 줄 수도 있다.
값이 있다면 그 값을 Map 에서 찾아서 반환하고, 없는 경우 새로 생성해서 Map 에 등록한다.
public classSonataextendsCar{
Sonata(){
carType = "Sonata";
}
}
public classSantafeextendsCar{
Santafe(){
carType = "Santafe";
}
}
class diagram 에서 ConcreteProduct 에 해당된다.
publicclassCarTest {
publicstaticvoidmain(String[] args) {
CarFactory factory = new HyundaiFactory();
Car newCar = factory.createCar("sonata");
System.out.println(newCar);
Car myCar = factory.returnMyCar("Tomas");
Car hisCar = factory.returnMyCar("Tomas");
System.out.println(myCar == hisCar);
}
}
실글톤 패턴
Singleton Pattern 이란?
클래스의 인스턴스는 오직 하나임을 보장하며 이 인스턴스에 접근할 수 있는 방법을 제공하는 패턴이다.
어떤 클래스 경우에는 정확히 하나의 인스턴스만을 갖도록 하는 것이 중요하다.
결국은 인스턴스가 여러개 있는 경우에 문제가 있는 경우 많이 사용한다.
한 회사에는 하나의 회계 시스템만이 운영하는 경우
DataBase와 연결하는 connection은 여러개일 수 있지만, connection pool은 한 개인 경우
자바에는 전역 변수가 존재하지 않으므로 인스턴스가 하나만 존재하도록 설계해야 하고 이에 접근 하는 방법을 제공한다.
publicclassProductMySqlDaoimplementsProductDao{
@OverridepublicvoidinsertProduct(Product product){
System.out.println("insert into MySql DB productId = " + product.getProductId());
}
@OverridepublicvoidupdateProduct(Product product){
System.out.println("update into MySql DB productId = " + product.getProductId());
}
@OverridepublicvoiddeleteProduct(Product product){
System.out.println("delete into MySql DB productId = " + product.getProductId());
}
}
publicclassProductOracleDaoimplementsProductDao{
@OverridepublicvoidinsertProduct(Product product){
System.out.println("insert into Oracle DB productId = " + product.getProductId());
}
@OverridepublicvoidupdateProduct(Product product){
System.out.println("update into Oracle DB productId = " + product.getProductId());
}
@OverridepublicvoiddeleteProduct(Product product){
System.out.println("delete into Oracle DB productId = " + product.getProductId());
}
}
publicclassUserInfoMySqlDaoimplementsUserInfoDao{
@OverridepublicvoidinsertUserInfo(UserInfo userInfo){
System.out.println("insert into MySql DB userId = " + userInfo.getUserId());
}
@OverridepublicvoidupdateUserInfo(UserInfo userInfo){
System.out.println("update into MySql DB userId = " + userInfo.getUserId());
}
@OverridepublicvoiddeleteUserInfo(UserInfo userInfo){
System.out.println("delete into MySql DB userId = " + userInfo.getUserId());
}
}
publicclassUserInfoOracleDaoimplementsUserInfoDao{
@OverridepublicvoidinsertUserInfo(UserInfo userInfo){
System.out.println("insert into Oracle DB userId = " + userInfo.getUserId());
}
@OverridepublicvoidupdateUserInfo(UserInfo userInfo){
System.out.println("update into Oracle DB userId = " + userInfo.getUserId());
}
@OverridepublicvoiddeleteUserInfo(UserInfo userInfo){
System.out.println("delete into Oracle DB userId = " + userInfo.getUserId());
}
}
publicinterfaceDaoFactory{
public UserInfoDao createUserInfoDao();
public ProductDao createProductDao();
}