Java工厂模式&抽象工厂模式

工厂模式

在工厂模式中,我们创建对象是不会暴露创建逻辑,并且通过共同的一个接口来指向新创建的对象

简介

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决接口选择问题

  • 优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

  • 缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

实现

  1. 创建一个接口,在里面定义一个方法。
//创建一个形状接口
public interface Shape {
    void draw();//定义一个绘制方法
}
  1. 创建实现接口的实体类,并且在方法中做自己的操作。
//创建一个实现接口的实体类
public class Circle implements Shape {
    @Override
    public void draw() {
        //放自己的操作
        Log.w("draw", "我是绘制圆形");
    }
}
public class Square implements Shape {
    @Override
    public void draw() {
        Log.w("draw", "我是绘制正方形");
    }
}
public class Triangle implements Shape {
    @Override
    public void draw() {
        Log.w("draw", "我是绘制三角形");
    }
}
  1. 创建一个工厂类,生成一个给定信息的实体类对象
//创建工厂类
public class ShapeFactory {
    //通过传递的类型获取不同的实例对象
    public Shape getShape(String type) {
        if (type == null) {
            return null;
        }
        if ("CIRCLE".equals(type)) {
            return new Circle();
        } else if ("SQUARE".equals(type)) {
            return new Square();
        } else if ("TRIANGLE".equals(type)) {
            return new Triangle();
        }
        return null;
    }
}
  1. 使用工厂类,通过传递过来的类型获取实例对象
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ShapeFactory factory = new ShapeFactory();
        Shape shape = factory.getShape("CIRCLE");
        shape.draw();
    }
}

输出结果:04-18 10:33:02.839 18493-18493/com.zs.test W/draw: 我是绘制圆形

抽象工厂模式

抽象工厂模式是围绕一个超级工厂创建其他工厂,改工厂又称为其他工厂的工厂。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显示指定他们的类。每个生成的工厂都能按照工厂模式提供对象。

简介

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。也是一个主要解决接口选择的问题

  • 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

  • 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

为了方便理解举例说明:

比如一个手机商家(抽象工厂),他的旗下可能有生产屏幕的一个工厂(其他工厂,只生产它负责的部分)他可以生产不同类型的屏幕(具体的产品),一个电池的工厂(其他工厂)他可以生产不同容量的电池(具体的产品),一个生产外壳的工厂(其他工厂)他可以生产不同类型的外壳(具体产品)。这时他(超级工厂)需要制造一款手机,那么他就向各个工厂(其他工厂)提出自己的需求,需要什么样的屏幕什么样的电池什么样的外壳(具体产品)来组成一款新的手机

实现

  1. 创建一个形状接口
public interface Shape {
    void draw();
}
  1. 创建一个实现接口(形状)的实体类
public class Circle implements Shape {
    @Override
    public void draw() {
        Log.w("draw", "我是绘制圆形");
    }
}
public class Square implements Shape {
    @Override
    public void draw() {
        Log.w("draw", "我是绘制正方形");
    }
}
  1. 创建一个颜色接口
public interface Color {
    void drawColor();//绘制的颜色
}
  1. 创建一个实现(颜色)接口实体类
public class Red implements Color{
    @Override
    public void drawColor() {
        Log.w("drawColor: ","绘制颜色为红色" );
    }
}
public class Blue implements Color{
    @Override
    public void drawColor() {
        Log.w("drawColor: ","绘制颜色为蓝色" );
    }
}
  1. 为颜色、形状对象创建抽象方法来获取工厂
public abstract class AbstractFactory {
   public abstract Color getColor(String color);

   public abstract Shape getShape(String shape);
}

6.创建继承抽象工厂的类

public class FactoryProducer extends AbstractFactory {
    @Override
    public Color getColor(String color) {
        if (color == null) {
            return null;
        }
        if ("RED".equals(color)) {
            return new Red();
        } else if ("BLUE".equals(color)) {
            return new Blue();
        } else if ("GREEN".equals(color)) {
            return new Green();
        }
        return null;
    }

    @Override
    public Shape getShape(String shape) {
        if (shape == null) {
            return null;
        }
        if ("CIRCLE".equals(shape)) {
            return new Circle();
        } else if ("SQUARE".equals(shape)) {
            return new Square();
        } else if ("TRIANGLE".equals(shape)) {
            return new Triangle();
        }
        return null;
    }
}

7.测试

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AbstractFactory factory = new FactoryProducer();
        factory.getColor("GREEN").drawColor();
        factory.getShape("SQUARE").draw();

    }
}

输出结果:

04-18 14:15:19.049 11336-11336/com.zs.test W/drawColor:: 绘制颜色为绿色
04-18 14:15:19.050 11336-11336/com.zs.test W/draw: 我是绘制正方形

猜你喜欢

转载自blog.csdn.net/yuan_fang_yan/article/details/79989936