04@设计模式—(02)抽象工厂模式

兄Die,写代码太累了?孤独寂寞冷?还没有女朋友吧?
关注微信公众号(瓠悠笑软件部落),送知识!送知识!送温暖!送工作!送女朋友!插科打诨哟!
huyouxiao.com
抽象工厂模式是基于一个父类工厂(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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值