简单工厂模式:
核心:就是利用接口的多态实现来选择实现功能。工厂根据客户端的需求生成对应的实现类,然后调用实现类里面的方法完成功能。
优点:有助于封装实现细节,实现客户端和具体逻辑的解耦。
缺点:不利于扩展,需要修改工厂类。
Java中的简单工厂模式的使用例子:
下面是一个计算器的例子,
原理:对外提供Calculator 帮助类来完成运算,具体实现细节由运算工厂类OperationFactory实现;工厂类根据客户端业务逻辑的不同来生成不同的实现类,最后由实现类来完成客户端的功能。多个实现类有一个公共的接口Operation ,可以根据需要实现该接口来完成对客户端需求的扩展。
直接看代码:
代码包结构:
具体代码:
ClientTest
package com.android.zs.client;
import com.android.zs.service.Calculator;
import org.junit.Assert;
/**
* Created by Administrator on 2016/9/4 0004.
*/
/**
* 测试类
*/
public class ClientTest {
private int num1;
private int num2;
@org.junit.Before
public void setUp() throws Exception {
num1 = 10;
num2 = 5;
}
@org.junit.Test
public void testCal() throws Exception {
int addResult = Calculator.add(num1, num2);
Assert.assertEquals(15, addResult);
int multiplicine = Calculator.multiplicine(num1, num2);
Assert.assertEquals(50, multiplicine);
}
}
Calculator
package com.android.zs.service;
/**
* Created by Administrator on 2016/9/4 0004.
*/
/**
* 计算器对象,用户根据该对象来实现运算操作
*/
public class Calculator {
/**
*加法
* @param num1
* @param num2
* @return
*/
public static int add(int num1,int num2){
Operation operation = OperationFactory.createOperation(OperationFactory.ADD_OPERATION);
return operation.getResult(num1,num2);
}
/**
* 乘法
* @param num1
* @param num2
* @return
*/
public static int multiplicine(int num1, int num2){
Operation operation = OperationFactory.createOperation(OperationFactory.MULTIPLICINE_OPERATION);
return operation.getResult(num1,num2);
}
}
OperationFactory
package com.android.zs.service;
/**
* Created by Administrator on 2016/9/4 0004.
*/
/**
* 运算符工厂
*/
public class OperationFactory {
public static final int ADD_OPERATION =1;
public static final int MULTIPLICINE_OPERATION =2;
public static Operation createOperation(int operationType){
if(ADD_OPERATION==operationType){
return new AddOperation();
}else if(MULTIPLICINE_OPERATION==operationType){
return new MultiplicineOperation();
}else{
return null;
}
}
}
Operation
package com.android.zs.service;
/**
* Created by Administrator on 2016/9/4 0004.
*/
/**
* 运算符的接口,可以实现该接口来扩展运算方法
*/
public interface Operation {
public int getResult(int num1, int num2);
}
AddOperation
package com.android.zs.service;
/**
* Created by Administrator on 2016/9/4 0004.
*/
/**
* 加法运算符,实现Operation接口
*/
public class AddOperation implements Operation {
@Override
public int getResult(int num1, int num2) {
return num1+num2;
}
}
MultiplicineOperation
package com.android.zs.service;
/**
* Created by Administrator on 2016/9/4 0004.
*/
/**
* 乘法运算符,实现Operation接口
*/
public class MultiplicineOperation implements Operation{
@Override
public int getResult(int num1, int num2) {
return num1*num2;
}
}
Android中的简单工厂模式的使用例子:
例如:
BitmapCompat
它是android中的Bitmap的一个帮助类,用来解决在不同android历史版本上的兼容性问题。
原理:首先在静态代码块中针对不同的android的api版本生成对应的实现类对象。然后对外提供帮助类方法,使用上一步生成的实现类对象,调用实现类对象的方法来屏蔽因为系统版本的不同而造成给客户端的不便。客户端根本无法接触到具体的实现细节,所以就感觉不到版本的不同了。 具体代码可以看下:
/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.support.v4.graphics; import android.graphics.Bitmap; /** * Helper for accessing features in {@link android.graphics.Bitmap} * introduced after API level 4 in a backwards compatible fashion. */ public final class BitmapCompat { /** * Interface for the full API. */ interface BitmapImpl { public boolean hasMipMap(Bitmap bitmap); public void setHasMipMap(Bitmap bitmap, boolean hasMipMap); public int getAllocationByteCount(Bitmap bitmap); } static class BaseBitmapImpl implements BitmapImpl { @Override public boolean hasMipMap(Bitmap bitmap) { return false; } @Override public void setHasMipMap(Bitmap bitmap, boolean hasMipMap) { } @Override public int getAllocationByteCount(Bitmap bitmap) { return bitmap.getRowBytes() * bitmap.getHeight(); } } static class HcMr1BitmapCompatImpl extends BaseBitmapImpl { @Override public int getAllocationByteCount(Bitmap bitmap) { return BitmapCompatHoneycombMr1.getAllocationByteCount(bitmap); } } static class JbMr2BitmapCompatImpl extends HcMr1BitmapCompatImpl { @Override public boolean hasMipMap(Bitmap bitmap){ return BitmapCompatJellybeanMR2.hasMipMap(bitmap); } @Override public void setHasMipMap(Bitmap bitmap, boolean hasMipMap) { BitmapCompatJellybeanMR2.setHasMipMap(bitmap, hasMipMap); } } static class KitKatBitmapCompatImpl extends JbMr2BitmapCompatImpl { @Override public int getAllocationByteCount(Bitmap bitmap) { return BitmapCompatKitKat.getAllocationByteCount(bitmap); } } /** * Select the correct implementation to use for the current platform. */ static final BitmapImpl IMPL; static { final int version = android.os.Build.VERSION.SDK_INT; if (version >= 19) { IMPL = new KitKatBitmapCompatImpl(); } else if (version >= 18) { IMPL = new JbMr2BitmapCompatImpl(); } else if (version >= 12) { IMPL = new HcMr1BitmapCompatImpl(); } else { IMPL = new BaseBitmapImpl(); } } public static boolean hasMipMap(Bitmap bitmap) { return IMPL.hasMipMap(bitmap); } public static void setHasMipMap(Bitmap bitmap, boolean hasMipMap) { IMPL.setHasMipMap(bitmap, hasMipMap); } /** * Returns the size of the allocated memory used to store this bitmap's pixels in a backwards * compatible way. * * @param bitmap the bitmap in which to return it's allocation size * @return the allocation size in bytes */ public static int getAllocationByteCount(Bitmap bitmap) { return IMPL.getAllocationByteCount(bitmap); } private BitmapCompat() {} }