兄Die,写代码太累了?孤独寂寞冷?还没有女朋友吧?
关注微信公众号(瓠悠笑软件部落),送知识!送知识!送温暖!送工作!送女朋友!插科打诨哟!
抽象工厂模式是基于一个父类工厂(super-factory)之上创建其他的工长(factories)。这个工厂也被成文工厂实例对象(factories)的工厂。这种设计模式属于创建型模式(creational pattern),这么模式为创建对象提供了最好的方法。
在抽象工厂模式中,一个接口(interface)负责创建相关对象的工厂,而且是在不明确指定他们的classes的情况下。每一个生成的factory可以作为一个工厂模式来获取对象实例(objects)。
具体实现
我们将新建两个接口:Shape 和 Color,接着创建实现了这些接口的相关类。接下来我们要创建一个抽象的工厂类AbstractFactory。工厂类ShapeFactory 和ColorFactoryare 都被定义为继承AbstractFactory父类。然后新建一个工厂的创建/生成 类FactoryProducer。我们的样例类AbstractFactoryPatternDemo将使用FactoryProducer 来获取一个AbstractFactory的对象实例。它将传递信息(CIRCLE / RECTANGLE / SQUARE for Shape)给AbstractFactory 以得到它所需要类型的对象。同样也可以传递信息 (RED / GREEN / BLUE for Color)给 AbstractFactory 以获取它所想要类型的对象。
第一步:创建接口Shape
Shape.java
public interface Shape {
void draw();
}
第二步:创建Shape接口的一些实现类
Rectangle.java
package com.patterns.factory;
public class Rectangle implements Shape{
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
Square.java
package com.patterns.factory;
public class Square implements Shape{
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
Circle.java
package com.patterns.factory;
public class Circle implements Shape{
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
第三步:创建接口Color
Create an interface for Colors.
Color.java
package com.patterns.factory;
public interface Color {
void fill();
}
第四步:创建接口Color的一些实现类
Red.java
package com.patterns.factory;
public class Red implements Color{
public void fill() {
System.out.println("Inside Red::fill() method.");
}
}
Green.java
package com.patterns.factory;
public class Green implements Color {
public void fill() {
System.out.println("Inside Green::fill() method.");
}
}
Blue.java
package com.patterns.factory;
public class Blue implements Color{
public void fill() {
System.out.println("Inside Blue::fill() method.");
}
}
第五步:新建一个抽象的类以获取工厂对象,工厂对象可以获取Color和Shape对象实例
package com.patterns.factory;
public abstract class AbstractFactory {
abstract Color getColor(String color);
abstract Shape getShape(String shape);
}
**第六步:新建工厂类继承AbstractFactory,以根据给定的信息生成相应类的对象实例 **
ShapeFactory.java
package com.patterns.factory;
public class ShapFactory extends AbstractFactory{
@Override
Color getColor(String colorType) {
return null;
}
@Override
public Shape getShape(String shapeType) {
if(shapeType ==null)
{
return null;
}
if(shapeType.equalsIgnoreCase("circle"))
{
return new Circle();
}else if(shapeType.equalsIgnoreCase("rectangle")){
return new Rectangle();
}else if(shapeType.equalsIgnoreCase("square")){
return new Square();
}else{
return null;
}
}
}
ColorFactory.java
package com.patterns.factory;
public class ColorFactory extends AbstractFactory{
@Override
public Color getColor(String colorType) {
if(colorType == null)
{
return null;
}
if(colorType.equals("red")){
return new Red();
}else if(colorType.equals("blue")){
return new Blue();
}else if(colorType.equals("green")){
return new Green();
}else{
return null;
}
}
@Override
Shape getShape(String shape) {
return null;
}
}
**第七步:创建一个Factory generator/producer 类以通过传入的参数类型信息(例如Shape或者Color)来获取工厂实例 **
FactoryProducer.java
package com.patterns.factory;
public class FactoryProducer {
public static AbstractFactory getFactory(String factoryType){
if(factoryType == null){
return null;
}
if(factoryType.equalsIgnoreCase("shape")){
return new ShapeFactory();
}else if(factoryType.equalsIgnoreCase("color")){
return new ColorFactory();
}else{
return null;
}
}
}
第八步:使用FactoryProducer类来获取AbstractFactory 类,好获取相应的工厂对象来根据传入的参数类型生成相应的对象
AbstractFactoryPatternDemo.java
package com.patterns.factory;
public class AbstractFactoryPatternDemo {
public static void main(String args[]){
//get shape factory
AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
Shape shape1 = shapeFactory.getShape("circle");
shape1.draw();
Shape shape2 = shapeFactory.getShape("rectangle");
shape2.draw();
Shape shape3 = shapeFactory.getShape("square");
shape3.draw();
AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
Color color1 = colorFactory.getColor("red");
color1.fill();
Color color2 = colorFactory.getColor("blue");
color2.fill();
Color color3 = colorFactory.getColor("green");
color3.fill();
}
}
第九步:验证输出结果
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside Red::fill() method.
Inside Blue::fill() method.
Inside Green::fill() method.