ООП для чайников. Паттерны проектирования. Паттерн фабричный метод (Factory method).

Еще один паттерн из группы порождающих – фабричный метод (factory method). Этот паттерн позволяет скрывать от клиента логику создания запрашиваемого объекта.
Этот паттерн следует применять когда заранее неизвестно объекты каких классов должны быть созданы, поскольку предполагается множество различных вариантов работы, либо объекты, которые класс создает должны быть определены уже в подклассе.

Пример применения паттерна на UML диаграмме:

А вот, пример применения паттерна в коде, – класс создающий разные типы документов, из одинаковых составных частей:

// IChapter.java
package patterns.factorymethod.report;

public interface IChapter {

	public String getType();

}

// IReport.java
package patterns.factorymethod.report;

public interface IReport {

	public void render();
	public void addChapter(IChapter chapter);	

}

// CustomReport.java
package patterns.factorymethod.report;

import java.util.ArrayList;
import java.util.Iterator;

public class CustomReport implements IReport {	

	protected ArrayList<IChapter> chapters = new ArrayList<IChapter>();	

	@Override
	public void render() {
		for (Iterator<IChapter> iter = chapters.iterator(); iter.hasNext();  ) {
			System.out.println(((IChapter)iter.next()).getType());
		}
	}

	@Override
	public void addChapter(IChapter chapter) {
		chapters.add(chapter);
	}

}

// ExtendedChapter.java
package patterns.factorymethod.report;

public class ExtendedChapter implements IChapter {

	@Override
	public String getType() {
		return "Extended";
	}

}

//  IndexChapter.java
package patterns.factorymethod.report;

public class IndexChapter implements IChapter {

	@Override
	public String getType() {
		return "Index";
	}

}

// SmallChapter.java
package patterns.factorymethod.report;

public class SmallChapter implements IChapter {

	@Override
	public String getType() {
		return "Small";
	}

}

// TitleChapter.java
package patterns.factorymethod.report;

public class TitleChapter implements IChapter {

	@Override
	public String getType() {
		return "Title";
	}

}

// ReportCreator.java
package patterns.factorymethod.report;

public class ReportCreator {

	public IReport createSummaryReport() {
		CustomReport report = new CustomReport();
		report.addChapter(new TitleChapter());
		report.addChapter(new SmallChapter());
		return report;
	}

	public IReport createFullReport() {
		CustomReport report = new CustomReport();
		report.addChapter(new TitleChapter());
		report.addChapter(new IndexChapter());
		report.addChapter(new ExtendedChapter());
		return report;
	}

}

// TestApp.java
package patterns.factorymethod;

import patterns.factorymethod.report.ReportCreator;

public class TestApp {

	public static void main(String[] args) {
		ReportCreator creator = new ReportCreator();
		creator.createFullReport().render();
		System.out.println();
		creator.createSummaryReport().render();
	}

}

Результат работы программы:

Title
Index
Extended

Title
Small

Site Footer

Sliding Sidebar

About Me

About Me

For whom this blog for?

For those who are interested in modern Internet technologies, IT business, startups, management, quality control, personal effectiveness, motivation. Here I write about what is interesting, about problems I faced and solutions I found. I hope it will be interesting to you either.

What motivates me to write?

The desire to improve, to study deeper topics that interest me. Find people with similar problems and tasks, together look for ways out and solutions.

Feel free to contact if you have anything to say to me

Old Flash site with my artistic works and misuc.