PostIT

[Java/DesignPattern] Java Design Pattern Part2 - Abstract Factory Pattern 본문

Java/Design 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. 결론


차후에 적겠습니다.



Comments