일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- interface
- SSH
- Linux
- framework
- Python
- Numpy
- centos
- error
- 자바
- db
- mariaDB
- Analysis
- data
- Deep
- Security
- Server
- Github
- DeepLearning
- learning
- javascript
- 함수
- Web
- 인공지능
- mysql
- Spring
- ai
- java
- Pattern
- LIST
- git
- Today
- Total
PostIT
[Java/DesignPattern] Java Design Pattern Part2 - Abstract Factory Pattern 본문
[Java/DesignPattern] Java Design Pattern Part2 - Abstract Factory Pattern
shun10114 2017. 7. 16. 00:03# [Java/DesignPattern] Java Design Pattern Part2 - Abstract Factory Pattern
## 1. 내용
Abstract Factory은 또한 Factory의 Factory로 불립니다. Abstract Factory Pattern은 객체를 생성하는 가장 좋은 방법 중 하나를 제공하는 Pattern으로 Creational Pattern 범주에 있습니다.
Abstract Factory 패턴에서 인터페이스는 명시 적으로 클래스를 지정하지 않고 관련 객체의 팩토리를 작성합니다. 생성 된 각 팩토리는 팩터 리 패턴에 따라 오브젝트를 제공 할 수 있습니다.
## 2. 코드 구현
Abstract Factory Pattern을 사용하여 이번 part2에서는 Store와 Item을 추상화하여 가게와 아이템을 주고받을 수 있도록 구현해보겠습니다.
1. Create Interface
- Store.java, Item.java
import com.pattern.part2.domain.item.Item;
public interface Store {
void detailStore();
void receiveItem(Item item);
void openStore(String name);
}
import com.pattern.part2.domain.store.Store;
public interface Item {
void sendItem(Store store);
void detailItem();
void makeItem(String name);
}
2. Create concrete Classes implementing the interfaces
- Beverage.Java, Clothing.Java
import java.util.Date;
import com.pattern.part2.domain.store.Store;
public class Clothing implements Item {
private String gender;
private int size;
private Date producedDate;
private String name;
//Getter & Setter
@Override
public void makeItem(String name) {
this.setName(name);
System.out.println("Clothing : makeItem() : " + this.getName());
}
@Override
public void sendItem(Store store) {
store.detailStore();
System.out.println("Clothing : sendItem : " + this.getName());
}
@Override
public void detailItem() {
System.out.println("Clothing : detailItem() : " + this.getName());
}
}
import java.util.Date;
import com.pattern.part2.domain.store.Store;
public class Beverage implements Item {
private int size; // Volume
private Date producedDate;
private String name;
//Getter & Setter
@Override
public void makeItem(String name) {
this.setName(name);
System.out.println("Clothing : makeItem() : " + this.getName());
}
@Override
public void sendItem(Store store) {
store.detailStore();
System.out.println("Clothing : sendItem : " + this.getName());
}
@Override
public void detailItem() {
System.out.println("Beverage : detailItem() : " + this.getName());
}
}
import java.util.Date;
import com.pattern.part2.domain.item.Item;
public class ConvenienceStore implements Store {
private String category;
private String name;
//Getter & Setter
@Override
public void openStore(String name) {
this.setName(name);
System.out.println("ConvenienceStore : " +this.getName()+" Opend, Date : "+ new Date());
}
public void receiveItem(Item item) {
System.out.println("ConvenienceStore : receiveItem()");
item.detailItem();
}
@Override
public void detailStore() {
System.out.println("ConvenienceStore : detailStore() : "+this.getName());
}
}
import java.util.Date;
import com.pattern.part2.domain.item.Item;
public class ShoesStore implements Store {
private String category;
private String name;
//Getter & Setter
@Override
public void openStore(String name){
this.setName(name);
System.out.println("ShoesStore : " +this.getName()+" Opend, Date : "+ new Date());
}
@Override
public void receiveItem(Item item) {
System.out.println("ShoesStore : receiveItem()");
item.detailItem();
}
@Override
public void detailStore() {
System.out.println("ShoesStore : detailStore() : "+this.getName());
}
}
3. Create an Abstract class to get factories for Item and Store Objects.
- AbstractFacotry.java
import com.pattern.part2.domain.item.Item;
import com.pattern.part2.domain.store.Store;
public abstract class AbstractFacotry {
public abstract Store openNewStore(String store);
public abstract Item producedItem(String item);
}
4. Create Factory classes extending AbstractFactory to generate object of concrete class based on given information.
- StoreFactory.java, ItemFactory.java
import com.pattern.part2.domain.item.Beverage;
import com.pattern.part2.domain.item.Clothing;
import com.pattern.part2.domain.item.Item;
import com.pattern.part2.domain.store.Store;
public class ItemFactory extends AbstractFacotry {
@Override
public Store openNewStore(String choice) {
return null;
}
@Override
public Item producedItem(String choice) {
if(choice.equalsIgnoreCase("BEVERAGE")){
return new Beverage();
} else if(choice.equalsIgnoreCase("CLOTHING")){
return new Clothing();
}
return null;
}
}
import com.pattern.part2.domain.item.Item;
import com.pattern.part2.domain.store.ConvenienceStore;
import com.pattern.part2.domain.store.ShoesStore;
import com.pattern.part2.domain.store.Store;
public class StoreFactory extends AbstractFacotry {
@Override
public Store openNewStore(String choice) {
if(choice.equalsIgnoreCase("CONVENIENCE")){
return new ConvenienceStore();
} else if(choice.equalsIgnoreCase("SHOES")){
return new ShoesStore();
}
return null;
}
@Override
public Item producedItem(String choice) {
// TODO Auto-generated method stub
return null;
}
}
6. Create a Factory generator/producer class to get factories by passing an information such as Item or Store
- FactoryProducer.java
public class FactoryProducer {
public static AbstractFacotry getFactory(String choice) {
if (choice.equalsIgnoreCase("ITEM")) {
return new ItemFactory();
} else if (choice.equalsIgnoreCase("STORE")) {
return new StoreFactory();
}
return null;
}
}
7. Use the FactoryProducer to get AbstractFactory in order to get factories of concrete classes by passing an information such as type.
- AbstractFactoryPatternMain.java
import com.pattern.part2.domain.item.Item;
import com.pattern.part2.domain.store.Store;
import com.pattern.part2.factory.AbstractFacotry;
import com.pattern.part2.factory.FactoryProducer;
public class AbstractFactoryPatternMain {
public static void main(String[] args){
AbstractFacotry itemFactory = FactoryProducer.getFactory("ITEM");
Item item1 = itemFactory.producedItem("BEVERAGE");
item1.makeItem("게토레이");
AbstractFacotry storeFactory = FactoryProducer.getFactory("STORE");
Store store1 = storeFactory.openNewStore("CONVENIENCE");
store1.openStore("GS24");
item1.sendItem(store1);
store1.receiveItem(item1);
Item item2 = itemFactory.producedItem("CLOTHING");
item2.makeItem("시리즈");
Store store2 = storeFactory.openNewStore("SHOES");
store2.openStore("금강제화");
item2.sendItem(store2);
store2.receiveItem(item2);
}
}
## 3. 결론
차후에 적겠습니다.
'Java > Design Pattern' 카테고리의 다른 글
[Java/DesignPattern] Java Design Pattern Part1 - Factory Pattern (0) | 2017.07.12 |
---|---|
[Java/DesignPattern] Java Design Pattern Overview (0) | 2017.07.12 |