工厂模式
在工厂模式中,我们创建对象是不会暴露创建逻辑,并且通过共同的一个接口来指向新创建的对象
简介
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决接口选择问题
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
实现
- 创建一个接口,在里面定义一个方法。
//创建一个形状接口
public interface Shape {
void draw();//定义一个绘制方法
}
- 创建实现接口的实体类,并且在方法中做自己的操作。
//创建一个实现接口的实体类
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", "我是绘制三角形");
}
}
- 创建一个工厂类,生成一个给定信息的实体类对象
//创建工厂类
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;
}
}
- 使用工厂类,通过传递过来的类型获取实例对象
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 里加代码,又要在具体的里面加代码。
为了方便理解举例说明:
比如一个手机商家(抽象工厂),他的旗下可能有生产屏幕的一个工厂(其他工厂,只生产它负责的部分)他可以生产不同类型的屏幕(具体的产品),一个电池的工厂(其他工厂)他可以生产不同容量的电池(具体的产品),一个生产外壳的工厂(其他工厂)他可以生产不同类型的外壳(具体产品)。这时他(超级工厂)需要制造一款手机,那么他就向各个工厂(其他工厂)提出自己的需求,需要什么样的屏幕什么样的电池什么样的外壳(具体产品)来组成一款新的手机
实现
- 创建一个形状接口
public interface Shape {
void draw();
}
- 创建一个实现接口(形状)的实体类
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 interface Color {
void drawColor();//绘制的颜色
}
- 创建一个实现(颜色)接口实体类
public class Red implements Color{
@Override
public void drawColor() {
Log.w("drawColor: ","绘制颜色为红色" );
}
}
public class Blue implements Color{
@Override
public void drawColor() {
Log.w("drawColor: ","绘制颜色为蓝色" );
}
}
- 为颜色、形状对象创建抽象方法来获取工厂
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: 我是绘制正方形