您的位置:首页 > 其它

Creational Patterns Part 2/5: Abstract Factory Pattern

2016-05-30 20:47 411 查看

Creational Patterns Part 2/5: Abstract Factory Pattern

目录

Creational Patterns Part 25 Abstract Factory Pattern

目录

Definition

UML Class Diagram

Implementation

Definition

Abstract Factory相当于一个超级工厂,这个工厂可以创建工厂,真可谓工厂的工厂。

在Abstract Factory Pattern中,有多个方法,每个方法产生一个工厂,每个产生的工厂又可以创建多个对象(Factory Pattern)。

何时使用?当希望可以同时控制几种对象的创建的时候,而Factory Pattern只可以控制一种对象的创建

使用频率:

High

UML Class Diagram



Implementation

在示例中Abstract Factory可以创建ShapeFactory和ColorFactory,然后再由两种工厂去创建各自的对象。用户根本不知道(不关心)对象是如何创建的。

// Shape.java
package designpatterns.creationalpatterns.abstractfactory;

public interface Shape {
void draw();
}

// Color.java
package designpatterns.creationalpatterns.abstractfactory;

public interface Color {
void fill();
}

// ShapeImpl.java
package designpatterns.creationalpatterns.abstractfactory;

class Circle implements Shape {

@Override
public void draw() {
System.out.println("Circle::draw()");
}

}

class Rectangle implements Shape {

@Override
public void draw() {
System.out.println("Rectangle::draw()");
}

}

class Square implements Shape {

@Override
public void draw() {
System.out.println("Shape::draw()");
}

}

// ColorImpl.java
package designpatterns.creationalpatterns.abstractfactory;

class Red implements Color {

@Override
public void fill() {
System.out.println("Red::fill()");
}
}

class Green implements Color {

@Override
public void fill() {
System.out.println("Green::fill()");
}
}

class Blue implements Color {

@Override
public void fill() {
System.out.println("Blue::fill()");
}
}

// AbstracFactory.java
package designpatterns.creationalpatterns.abstractfactory;

abstract class AbstractFactory {
abstract Shape getShape(String shape);
abstract Color getColor(String color);
}

class ShapeFactory extends AbstractFactory {

@Override
Shape getShape(String shapeType) {
if (shapeType == null)  return null;

if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("SQUARE")) {
return new Square();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
}
return null;
}

@Override
Color getColor(String color) {
return null;
}
}

class ColorFactory extends AbstractFactory {

@Override
Shape getShape(String shapeType) {
return null;
}

@Override
Color getColor(String color) {
if (color == null)  return null;

if (color.equalsIgnoreCase("RED")) {
return new Red();
} else if (color.equalsIgnoreCase("GREEN")) {
return new Green();
} else if (color.equalsIgnoreCase("BLUE")) {
return new Blue();
}

return null;
}
}

// AbstractFactoryDemo.java
package designpatterns.creationalpatterns.abstractfactory;

public class AbstractFactoryDemo {
public static void main(String[] args) {
AbstractFactory absf = FactoryProduct.getFactory("Shape");

Shape shape = null;
shape = absf.getShape("Circle");
shape.draw();

shape = absf.getShape("Square");
shape.draw();

shape = absf.getShape("Rectangle");
shape.draw();

System.out.println("=================");

absf = FactoryProduct.getFactory("Color");
Color color = null;
color = absf.getColor("Red");
color.fill();

color = absf.getColor("Green");
color.fill();

color = absf.getColor("Blue");
color.fill();
}
}

class FactoryProduct {

public static AbstractFactory getFactory(String factory) {
if(factory.equalsIgnoreCase("SHAPE")) {
return new ShapeFactory();
} else if(factory.equalsIgnoreCase("COLOR")) {
return new ColorFactory();
}

return null;
}
}

// output
Circle::draw()
Shape::draw()
Rectangle::draw()
=================
Red::fill()
Green::fill()
Blue::fill()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息