디자인 모델 의 간단 한 공장 방법 모델 과 공장 방법 모델

11349 단어
현재 인터넷 차량 거래 시스템 이 있다 고 가정 하면 현재 세 가지 차형, 링컨, 캐딜락 과 벡 이 있 고 시스템 은 사용자 의 선택 에 따라 해당 제품 의 구체 적 인 정 보 를 표시 할 수 있다. 그러면 우 리 는 이렇게 디자인 할 수 있다.
모든 자동차 종류의 인터페이스:
링컨 종류:
public interface Car {
	public abstract String getDescription();
}

Cadillac 클래스:
public class Lincoln implements Car {

	@Override
	public String getDescription() {
		String description = "this is Lincoln";
		return description;
	}

}

Buick 클래스:
public class Cadillac implements Car {

	@Override
	public String getDescription() {
		String description = "this is Cadillac";
		return description;
	}

}

사용자 인터페이스 클래스:
public class Buick implements Car {

	@Override
	public String getDescription() {
		String description = "this is Buick";
		return description;
	}

}

테스트:
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class clientGUI extends JFrame implements ActionListener{

	private String LINCOLN = "Lincoln";
	private String CADILLAC = "Cadillac";
	private String BUICK = "Buick";
	
	private JLabel labelShowChoice;
	private JTextArea textShowInfo;
	private JComboBox Choice;
	
	private JPanel panelNorth;
	private JPanel panelCenter;
	
	public void initComponents(){
		labelShowChoice = new JLabel("     :   ");
		textShowInfo = new JTextArea();
		textShowInfo.setColumns(15);
		Choice = new JComboBox();
		Choice.addItem(LINCOLN);
		Choice.addItem(CADILLAC);
		Choice.addItem(BUICK);
		Choice.addActionListener(this);
		panelNorth = new JPanel();
		panelCenter = new JPanel();
	}
	
	public void panelAddComponenets(){
		panelNorth.add(labelShowChoice);
		panelNorth.add(Choice);
		panelCenter.add(textShowInfo);
	}
	
	public void mainFrameAddPanel(){
		this.add("North", panelNorth);
		this.add("Center", panelCenter);
	}
	
	public void mianFramSet(){
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		this.setLocation((d.width - this.getSize().width)/2, (d.height - this.getSize().height)/2);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(300, 200);
		this.setVisible(true);
	}

	public clientGUI(){
		initComponents();
		panelAddComponenets();
		mainFrameAddPanel();
		mianFramSet();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getSource() == Choice){
			String choice = (String)Choice.getSelectedItem();
			Car car = null;
			if(choice.equals(LINCOLN)){
				car = new Lincoln();
			}
			if(choice.equals(CADILLAC)){
				car = new Cadillac();
			}
			if(choice.equals(BUICK)){
				car = new Buick();
			}
			String carDescription = car.getDescription();
			textShowInfo.setText(carDescription);
		}
	}
}

이러한 디자인 은 의심 할 여지없이 많은 단점 이 있다. 첫째, 클 라 이언 트 에 if 문구 가 많 고 그 다음 에 클 라 이언 트 는 모든 제품 류 의 세부 사항 을 알 아야 한다.그렇다면 상술 한 디자인 을 어떻게 개선 할 것 인가?아마도 우 리 는 조건 에 따라 하나의 전문 적 인 유형 으로 구체 적 인 제품 을 만 들 수 있 을 것 이다.이렇게 하면 클 라 이언 트 는 모든 제품 의 세부 사항 을 알 필요 가 없다.이것 이 바로 디자인 모델 이 바로 공장 방법 모델 이다. 다음은 간단 한 공장 방법 모델 과 공장 방법 모델 로 상기 한 예 를 소개 한다.
단순 공장 모드
    간단 한 공장 방법 모델 을 사용 하고 도표 의 디자인 은 다음 과 같다.
모든 자동차의 인터페이스:
public class main {

	public static void main(String[] args) {
		clientGUI  cGUI = new clientGUI();
	}
}

Lincoln 클래스:
public interface Car {
	public abstract String getDescription();
}

Cadillac 클래스:
public class Lincoln implements Car {

	@Override
	public String getDescription() {
		String description = "this is Lincoln";
		return description;
	}

}

Buick 클래스:
public class Cadillac implements Car {

	@Override
	public String getDescription() {
		String description = "this is Cadillac";
		return description;
	}

}

공장 종류:
public class Buick implements Car {

	@Override
	public String getDescription() {
		String description = "this is Buick";
		return description;
	}

}

사용자 인터페이스:
public class carObjCreator {
	private String LINCOLN = "Lincoln";
	private String CADILLAC = "Cadillac";
	private String BUICK = "Buick";
	public Car getCarObj(String carType){
		Car car = null;
		if(carType.equals(LINCOLN)){
			car = new Lincoln();
		}
		if(carType.equals(CADILLAC)){
			car = new Cadillac();
		}
		if(carType.equals(BUICK)){
			car = new Buick();
		}
		return car;
	}
}

테스트:
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class clientGUI extends JFrame implements ActionListener{

	private String LINCOLN = "Lincoln";
	private String CADILLAC = "Cadillac";
	private String BUICK = "Buick";
	
	private JLabel labelShowChoice;
	private JTextArea textShowInfo;
	private JComboBox Choice;
	
	private JPanel panelNorth;
	private JPanel panelCenter;
	
	public void initComponents(){
		labelShowChoice = new JLabel("     ");
		textShowInfo = new JTextArea();
		textShowInfo.setColumns(15);
		Choice = new JComboBox();
		Choice.addItem(LINCOLN);
		Choice.addItem(CADILLAC);
		Choice.addItem(BUICK);
		Choice.addActionListener(this);
		panelNorth = new JPanel();
		panelCenter = new JPanel();
	}
	
	public void panelAddComponenets(){
		panelNorth.add(labelShowChoice);
		panelNorth.add(Choice);
		panelCenter.add(textShowInfo);
	}
	
	public void mainFrameAddPanel(){
		this.add("North", panelNorth);
		this.add("Center", panelCenter);
	}
	
	public void mianFramSet(){
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		this.setLocation((d.width - this.getSize().width)/2, (d.height - this.getSize().height)/2);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(300, 200);
		this.setVisible(true);
	}

	public clientGUI(){
		initComponents();
		panelAddComponenets();
		mainFrameAddPanel();
		mianFramSet();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getSource() == Choice){
			String choice = (String)Choice.getSelectedItem();
			carObjCreator carCreator = new carObjCreator();
			Car car = carCreator.getCarObj(choice);
			String carDescription = car.getDescription();
			textShowInfo.setText(carDescription);
		}
	}
}

    사용자 가 사용 할 때 인 스 턴 스 를 만 드 는 직책 은 모두 공장 류 에 맡 기 는 것 을 볼 수 있 습 니 다. 그러면 클 라 이언 트 는 그렇게 많은 if 문 구 를 필요 로 하지 않 고 대상 이 어떻게 만 들 고 조직 하 는 지 알 필요 가 없습니다.
    그러나 공장 류 는 모든 실례 의 창설 논리 에 집중 되 어 있 기 때문에 공장 류 에 문제 가 생기 면 모든 클 라 이언 트 가 영향 을 받는다.그 밖 에 우리 가 제품 을 새로 추가 하면 공장 류 를 수정 해 야 한다. 해당 하 는 공장 류 는 다시 컴 파일 해 야 한다. 즉, 시스템 이 확장 개방 에 대해 폐쇄 를 수정 하 는 원칙 에 위배 된다.
공장 방법 모델
    공장 방법 모델 을 사용 할 때 상기 사례 의 디자인 은 반드시 이렇게 해 야 한다.
모든 자동차의 인터페이스:
public class main {

	public static void main(String[] args) {
		clientGUI  cGUI = new clientGUI();
	}
}

Lincoln 클래스:
public interface Car {
	public abstract String getDescription();
}

Cadillac 클래스:
public class Lincoln implements Car {

	@Override
	public String getDescription() {
		String description = "this is Lincoln";
		return description;
	}

}

Buick 클래스:
public class Cadillac implements Car {

	@Override
	public String getDescription() {
		String description = "this is Cadillac";
		return description;
	}

}

모든 공장 클래스 의 인터페이스:
public class Buick implements Car {

	@Override
	public String getDescription() {
		String description = "this is Buick";
		return description;
	}

}

Lincoln 대상 클래스 만 들 기:
public interface carCreator {
	public Car getCarObj();
}

Cadillac 대상 클래스 만 들 기:
public class LincolnCreator implements carCreator {

	@Override
	public Car getCarObj() {
		// TODO Auto-generated method stub
		return new Lincoln();
	}

}

Buick 대상 클래스 만 들 기:
public class CadillacCreator implements carCreator {

	@Override
	public Car getCarObj() {
		// TODO Auto-generated method stub
		return new Cadillac();
	}

}

사용자 인터페이스:
public class BuickCreator implements carCreator {

	@Override
	public Car getCarObj() {
		// TODO Auto-generated method stub
		return new Buick();
	}

}

테스트:
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class clientGUI extends JFrame implements ActionListener{

	private String LINCOLN = "Lincoln";
	private String CADILLAC = "Cadillac";
	private String BUICK = "Buick";
	
	private JLabel labelShowChoice;
	private JTextArea textShowInfo;
	private JComboBox Choice;
	
	private JPanel panelNorth;
	private JPanel panelCenter;
	
	public void initComponents(){
		labelShowChoice = new JLabel("     :");
		textShowInfo = new JTextArea();
		textShowInfo.setColumns(15);
		Choice = new JComboBox();
		Choice.addItem(LINCOLN);
		Choice.addItem(CADILLAC);
		Choice.addItem(BUICK);
		Choice.addActionListener(this);
		panelNorth = new JPanel();
		panelCenter = new JPanel();
	}
	
	public void panelAddComponenets(){
		panelNorth.add(labelShowChoice);
		panelNorth.add(Choice);
		panelCenter.add(textShowInfo);
	}
	
	public void mainFrameAddPanel(){
		this.add("North", panelNorth);
		this.add("Center", panelCenter);
	}
	
	public void mianFramSet(){
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		this.setLocation((d.width - this.getSize().width)/2, (d.height - this.getSize().height)/2);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(300, 200);
		this.setVisible(true);
	}

	public clientGUI(){
		initComponents();
		panelAddComponenets();
		mainFrameAddPanel();
		mianFramSet();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getSource() == Choice){
			String choice = (String)Choice.getSelectedItem();
			carCreator CC = null;
			if(choice.equals(LINCOLN)){
				 CC = new LincolnCreator();
			}
			if(choice.equals(CADILLAC)){
				 CC = new CadillacCreator();
			}
			if(choice.equals(BUICK)){
				 CC = new BuickCreator();
			}
			Car car =  CC.getCarObj();
			String carDescription = car.getDescription();
			textShowInfo.setText(carDescription);
		}
	}
}

    만약 에 우리 가 차형 을 추가 하려 면 이 차형 의 유형 을 증가 하고 이 차형 대상 의 생 성 유형 을 만 드 는 것 이 개폐 원칙 에 부합 해 야 한다.

좋은 웹페이지 즐겨찾기