( ) . :
, , ( );
() (), .
GoF
GoF , . .
.
, , , , , . ( ).
:
1. .
. .
2. . .
3. . .
4. .
, . , .
.
:
Abstract Factory ( ) ;
Factory () ( Abstract Factory);
Builder () ;
Singleton () ;
Prototype () . , - ;
Factory Method ( ) , .
Factory
, . , .
. 5.6. Factory
ClassFactory getClassFromFactory(String id), - Base .
, Base.
|
|
.
/* # 10: Factory: Base.java: First.java: Second.java: ClassFactory.java: Main.java */
package chapt05.factory;
public abstract class Base {
public abstract void perform();
}
package chapt05.factory;
public class First extends Base {
public void perform() {
System. out. println("First");
}
}
package chapt05.factory;
public class Second extends Base {
public void perform() {
System. out. println("Second");
}
}
package chapt05.factory;
public class ClassFactory {
private enum Signs { FIRST, SECOND }
public static Base getClassFromFactory(String id) {
Signs sign = Signs. valueOf (id.toUpperCase());
switch (sign){
case FIRST: return new First();
case SECOND: return new Second();
default: throw new EnumConstantNotPresentException(
Signs. class, sign.name());
}
}
}
package chapt05.factory;
public class Main {
public static void main(String args[]) {
Base ob1 =
ClassFactory. getClassFromFactory ("first");
Base ob2 =
ClassFactory. getClassFromFactory ("second");
ob1.perform();
ob2.perform();
}
}
# 5 .
AbstractFactory
, , . - . .
. - , .
. , .
/* # 11: - :
AbstractFactory.java */
package chapt05.abstractfactory;
public class AbstractFactory {
enum Color { BLACK, WHITE };
public static BaseFactory getFactory(String data) { Color my = Color.valueOf(data.toUpperCase());
switch (my){
case BLACK: return new BlackFactory();
case WHITE: return new WhiteFactory();
default: throw new
EnumConstantNotPresentException(Signs. class, sign.name());
}
}
}
. 5.7. AbstractFactory
. BaseFactory , BlackFactory WhiteFactory , . -.
/* # 12: - :
BaseFactory.java: BlackFactory.java: WhiteFactory.java */
package chapt05.abstractfactory;
public abstract class BaseFactory {
public abstract Circle createCircle(double radius);
public abstract Triangle createTriangle(double a,
double b);
}
package chapt05.abstractfactory;
public class BlackFactory extends BaseFactory {
|
|
public Circle createCircle(double radius) {
return new BlackCircle(radius);
}
public Triangle createTriangle(double a, double b){
return new BlackTriangle(a,b);
}
}
package chapt05.abstractfactory;
public class WhiteFactory extends BaseFactory {
public Circle createCircle(double radius) {
return new WhiteCircle(radius);
}
public Triangle createTriangle(double a, double b){
return new WhiteTriangle(a, b);
}
}
-: Circle, Triangle. :
.
/* # 13: -: Circle.java: Triangle.java */
package chapt05.abstractfactory;
public abstract class Circle {
protected double radius;
protected String color;
public abstract void square();
}
package chapt05.abstractfactory;
public class BlackCircle extends Circle {
public BlackCircle(double radius){
this. radius = radius;
color = "Black";
}
public void square(){
double s = Math.PI * Math.pow(radius, 2);
System. out. println(color + " Circle"
+ " Square = " + s);
}
}
package chapt05.abstractfactory;
public class WhiteCircle extends Circle{
public WhiteCircle(double radius){
this. radius = radius;
color = "White";
}
public void square(){
double s = Math.PI * Math.pow(radius, 2);
System. out. println(color + " Circle "
+ "Square = " + s);
}
}
package chapt05.abstractfactory;
public abstract class Triangle {
protected double a, b;
protected String color;
public abstract void square();
}
package chapt05.abstractfactory;
public class BlackTriangle extends Triangle {
public BlackTriangle (double a, double b){
this. a = a;
this. b = b;
color = "Black";
}
public void square(){
double s = a * b / 2;
System. out. println(color + " Triangle"
+ " Square = " + s);
}
}
package chapt05.abstractfactory;
public class WhiteTriangle extends Triangle {
public WhiteTriangle (double a, double b) {
this. a = a;
this. b = b;
color = "White";
}
public void square(){
double s = 0.5 * a * b;
System. out. println(color + " Triangle"
+ " Square = " + s);
}
}
.
/* # 14: AbstractFactory: Main.java */
package chapt05.abstractfactory;
public class Main {
public static void main(String[] args) {
BaseFactory factory1 =
AbstractFactory. getFactory ("black");
BaseFactory factory2 =
AbstractFactory. getFactory ("white");
Circle ob1 = factory1.createCircle(1.232);
Circle ob2 = factory2.createCircle(1);
Triangle ob3 = factory1.createTriangle(12,5);
Triangle ob4 = factory2.createTriangle(1,7);
ob1.square();
ob2.square();
ob3.square();
ob4.square();
}
}
Builder
, . .
. 5.8. Builder
BaseBuilder User. XMLBuilder DBBuilder User, . - , , . -.
Builder .
/* # 15: : User.java */
package chapt05.builder;
public class User {
private String login = "Guest";
private String password = "Kc";
public String getLogin() {
return login;
}
public void setLogin(String login) {
this. login = login;
}
public String getPassword() {
return password;
}
|
|
public void setPassword(String password) {
this. password = password;
}
}
BaseBuilder -, . XMLBuilder DBBuilder , . , User .
/* # 16: : BaseBuilder.java: XMLBuilder.java: DBBuilder.java */
package chapt05.builder;
public abstract class BaseBuilder {
protected User user = new User();
public User getUser() {
return user;
}
public abstract void buildLogin();
public abstract void buildPassword();
}
package chapt05.builder;
public class XMLBuilder extends BaseBuilder {
public void buildLogin() {
//
user.setLogin("Admin");
}
public void buildPassword() {
//
user.setPassword("Qu");
}
}
package chapt05.builder;
public class DBBuilder extends BaseBuilder {
public void buildLogin() {
//
user.setLogin("Moderator");
}
public void buildPassword() {
//
user.setPassword("Ku");
}
}
.
/* # 17: : Main.java */
package chapt05.builder;
public class Main {
private static User buildUser(BaseBuilder builder) {
builder.buildLogin();
builder.buildPassword();
return builder.getUser();
}
public static void main(String args[]) {
User e1 = buildUser (new XMLBuilder());
User e2 = buildUser (new DBBuilder());
System. out. println(e1.getLogin());
System. out. println(e1.getPassword());
System. out. println(e2.getLogin());
System. out. println(e2.getPassword());
}
}
Singleton
, . .
/* # 18: : Singleton.java */
package chapt05.singleton;
public class Singleton {
private static Singleton instance = null;
private SingletonTrust() {
}
public static Singleton getInstance() {
if (instance == null) {
System. out. println("Creating Singleton");
instance = new Singleton();
}
return instance;
}
}
getInstance(), . , .
.
:
Proxy () ;
Composite () , ;
Adapter () . ;
Bridge () , ;
Decorator () . ;
Facade () .
Bridge
(Abstraction) (Implementor) , . Bridge , . . , .
|
|
. 5.9. Bridge
/* # 18: Implementor : Color.java: YellowColor.java */
package chapt05.implementor;
public abstract class Color { //implementor
public abstract void useBrush();
}
package chapt05.implementor;
public class YellowColor extends Color {
public void useBrush() {
System. out. println("BrushColor - Yellow");
}
}
Color , Implementor.
YellowColor Color.
/* # 19: : Shape.java: Circle.java:
Rectangle.java */
package chapt05.abstraction;
import chapt05.implementor.*;
public abstract class Shape { //abstraction
protected Color color;
public Shape (){
color = null;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this. color = color;
}
public abstract void performWithColor();
}
package chapt05.abstraction;
import chapt05.implementor.*;
public class Circle extends Shape {
public Circle(Color color) {
setColor(color);
}
public void performWithColor() {
System. out. println("Performing in Circle class");
color.useBrush();
}
}
package chapt05.abstraction;
import chapt05.implementor.*;
public class Rectangle extends Shape {
public Rectangle(Color color) {
setColor(color);
}
public void performWithColor() {
System. out. println("Performing in Rectangle class");
color.useBrush();
}
}
Shape , Circle Rectangle .
/* # 20: Bridge: Main.java */
package chapt05.bridge;
import chapt05.abstraction.*;
import chapt05.implementor.*;
public class Main {
public static void main(String args[]) {
YellowColor color = new YellowColor();
new Rectangle(color).performWithColor();
new Circle(color).performWithColor();
}
}
. . Abstraction Implementor .
Decorator
, . , , . Decorator .
. 5.10. Decorator
/* # 21: : Driver.java */
package chapt05.decorator;
public abstract class Driver {
public abstract void do();
}
DriverDecorator , Driver, .
/* # 22: - Driver: DriverDecorator.java */
package chapt05.decorator;
public abstract class DriverDecorator extends Driver {
protected Driver driver;
public DriverDecorator(Driver driver) {
this. driver = driver;
}
public void do() {
driver.do();
}
}
CarDriver , .
/* # 23: : CarDriver.java */
package chapt05.decorator;
public class CarDriver extends Driver {
public void do() { //
System. out. println("I am a driver");
}
}
BusDriver
addedBehaviorOne() , do() CarDriver.
/* # 24: : BusDriver.java */
package chapt05.decorator;
public class BusDriver extends DriverDecorator {
public BusDriver(Driver driver) {
super (driver);
}
private void addedBehaviorOne() {
System. out. println("I am bus driver");
}
public void do() {
driver.do();
addedBehaviorOne();
}
}
CarDriverAndForwardingAgent addedBehaviorTwo() -, do() CarDriver.
/* # 25: -:CarDriverAndForwardingAgent.java*/
package chapt05.decorator;
public class CarDriverAndForwardingAgent
|
|
extends DriverDecorator {
public CarDriverAndForwardingAgent(Driver driver){
super (driver);
}
private void addedBehaviorTwo() {
System. out. println("I am a Forwarding Agent");
}
public void do() {
driver.do();
addedBehaviorTwo();
}
}
CarDriver , -, .
/* # 26: Decorator: Main.java */
package chapt05.decorator;
public class Main {
public static void main(String args[]){
Driver carDriver = new CarDriver();
Main runner = new Main();
runner.doDrive(carDriver);
runner.doDrive(new BusDriver(carDriver));
runner.doDrive(
new CarDriverAndForwardingAgent(carDriver));
}
public void doDrive(Driver driver){
driver.do();
}
}
.
:
Chain of Responsibility ( ) - -, ;
Command () , ;
Iterator () , ;
Mediator () , , ;
Memento () ;
Observer () ;