編輯:關於Android編程
1、面試的時候問到這樣的問題:
在一個ListView 的item子視圖中,很多種不同的顯示樣式,或者說是,為了更好的維護,或者以後需要添加不同的樣式,應該怎麼做?
我一下就想到的是工廠的模式,利用工程,編寫ViewFactory,方法中有getView()的方法,以後需要時,添加相應的參數,並編寫不同的實現類,也就是不同樣式的視圖;
但是這樣的答案,似乎沒有讓面試官滿意;
他的意思是,書寫不同的Adapter ,通過適配器中的getView()獲取不同的View,即:一個樣式的視圖,對應一個Adapter,即在listView中一個Adapter,這個Adapter中擁有很多不同樣式的Adapter,這樣初始化,編寫的時候,listView的Adapter就不需要修改了,這樣只需要,添加以後需要的那個視圖樣式的adapter 就可以了。
回顧設計模式的時候,突然想到這樣的問題,便寫了下來,
想到的是,其實面試的時候,我這樣的回答是可以解決問題的,只是以前學的時候,沒有考慮到簡單工廠模式的缺點。
現在需要學習的就是這個了;
言歸正傳
Android設計模式--簡單工廠模式
1、 定義:
屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。
2、實質:
實質是由一個工廠類根據傳入的參數,動態決定應該創建哪一個產品類;
3、 工廠角色:
這是簡單工廠模式的核心,由它負責創建所有的類的內部邏輯。
4、優點:
不必管這些對象究竟如何創建及如何組織的.明確了各自的職責和權利,有利於整個軟件體系結構的優化。
5、缺點:
5.1、工廠類所能創建的類只能是事先考慮到的,如果需要添加新的類,則就需要改變工廠類了;
5.2、工廠類集中了所有實例的創建邏,當對象越來越多時,工廠類對系統的維護和擴展非常不利;
5.3、簡單工廠模式違背了“開放封閉原則”,就是違背了“系統對擴展開放,對修改關閉”的原則,違反了高內聚責任分配原則;
5.4、當需要添加產品類時,工廠類內部的邏輯需要改動很多很多;
6、盡管面試也是失敗了,但是學習還是不能停啊,
寫了一個簡單的demo:
接口類:
package com.example.demo.SimpleFactory; /** * 統一的彩票接口 * @author qubian * @data 2015年6月4日 * @email [email protected] * */ public interface Lottery { public String getLotteryName(); }
package com.example.demo.SimpleFactory; /** * 雙色球 處理 * * @author qubian * @data 2015年6月4日 * @email [email protected] * */ public class SSQLottery implements Lottery{ @Override public String getLotteryName() { return "雙色球"; } }
package com.example.demo.SimpleFactory; /** * 大樂透處理 * @author qubian * @data 2015年6月4日 * @email [email protected] * */ public class DLTLottery implements Lottery{ @Override public String getLotteryName() { return "大樂透"; } }
package com.example.demo.SimpleFactory; /** * 彩票彩種工廠處理 * @author qubian * @data 2015年6月4日 * @email [email protected] * */ public class LotteryFactory { public enum LotteryEnum { SSQ, DLT, QLC,FC3D,FJ115; } private static Lottery lottery =null; public static Lottery getLottery(LotteryEnum e) { if (e ==LotteryEnum.SSQ) { lottery= new SSQLottery(); }else if (e ==LotteryEnum.SSQ) { lottery= new DLTLottery(); } return lottery; } public static String getLotteryName(LotteryEnum e) { return getLottery(e).getLotteryName(); } }
package com.example.demo.SimpleFactory; import com.example.demo.SimpleFactory.LotteryFactory.LotteryEnum; import android.util.Log; /** * 使用 * @author qubian * @data 2015年6月4日 * @email [email protected] * */ public class UseSimpleFactory { private static final String TAG="UseSimpleFactory"; public void use() { Log.i(TAG, LotteryFactory.getLotteryName(LotteryEnum.SSQ)); } }
public class BitmapFactory { private static final int DECODE_BUFFER_SIZE = 16 * 1024; public static class Options { /** * Create a default Options object, which if left unchanged will give * the same result from the decoder as if null were passed. */ public Options() { inDither = false; inScaled = true; inPremultiplied = true; } /** * Decode a file path into a bitmap. If the specified file name is null, * or cannot be decoded into a bitmap, the function returns null. * * @param pathName complete path name for the file to be decoded. * @param opts null-ok; Options that control downsampling and whether the * image should be completely decoded, or just is size returned. * @return The decoded bitmap, or null if the image data could not be * decoded, or, if opts is non-null, if opts requested only the * size be returned (in opts.outWidth and opts.outHeight) */ public static Bitmap decodeFile(String pathName, Options opts) { Bitmap bm = null; InputStream stream = null; try { stream = new FileInputStream(pathName); bm = decodeStream(stream, null, opts); } catch (Exception e) { /* do nothing. If the exception happened on open, bm will be null. */ Log.e("BitmapFactory", "Unable to decode stream: " + e); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { // do nothing here } } } return bm; } /** * Decode a file path into a bitmap. If the specified file name is null, * or cannot be decoded into a bitmap, the function returns null. * * @param pathName complete path name for the file to be decoded. * @return the resulting decoded bitmap, or null if it could not be decoded. */ public static Bitmap decodeFile(String pathName) { return decodeFile(pathName, null); } /** * Decode a new Bitmap from an InputStream. This InputStream was obtained from * resources, which we pass to be able to scale the bitmap accordingly. */ public static Bitmap decodeResourceStream(Resources res, TypedValue value, InputStream is, Rect pad, Options opts) { if (opts == null) { opts = new Options(); } if (opts.inDensity == 0 && value != null) { final int density = value.density; if (density == TypedValue.DENSITY_DEFAULT) { opts.inDensity = DisplayMetrics.DENSITY_DEFAULT; } else if (density != TypedValue.DENSITY_NONE) { opts.inDensity = density; } } if (opts.inTargetDensity == 0 && res != null) { opts.inTargetDensity = res.getDisplayMetrics().densityDpi; } return decodeStream(is, pad, opts); } /** * Synonym for {@link #decodeResource(Resources, int, android.graphics.BitmapFactory.Options)} * will null Options. * * @param res The resources object containing the image data * @param id The resource id of the image data * @return The decoded bitmap, or null if the image could not be decode. */ public static Bitmap decodeResource(Resources res, int id) { return decodeResource(res, id, null); } /** * Decode an immutable bitmap from the specified byte array. * * @param data byte array of compressed image data * @param offset offset into imageData for where the decoder should begin * parsing. * @param length the number of bytes, beginning at offset, to parse * @param opts null-ok; Options that control downsampling and whether the * image should be completely decoded, or just is size returned. * @return The decoded bitmap, or null if the image data could not be * decoded, or, if opts is non-null, if opts requested only the * size be returned (in opts.outWidth and opts.outHeight) */ public static Bitmap decodeByteArray(byte[] data, int offset, int length, Options opts) { if ((offset | length) < 0 || data.length < offset + length) { throw new ArrayIndexOutOfBoundsException(); } Bitmap bm; Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "decodeBitmap"); try { bm = nativeDecodeByteArray(data, offset, length, opts); if (bm == null && opts != null && opts.inBitmap != null) { throw new IllegalArgumentException("Problem decoding into existing bitmap"); } setDensityFromOptions(bm, opts); } finally { Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS); } return bm; } }
前面分析過 u-boot1.1.6 三個階段的啟動過程,也嘗試自己寫了一個簡單的 bootloader ,是時候嘗試移植一個相對較新一點的 u-boot 了,看過韋東山老
介紹Android中的網絡請求一般就是兩種 HttpURLConnection 和HttpClient,不論是哪一種在使用的時候都是經過一系列的封裝 很繁瑣有沒有,而Go
寫BlueStacks安卓模擬器腳本的一般步驟,其實BlueStacks安卓模擬器腳本不是很難,只要跟下面步驟來,一步一步走,就學了。BlueStacks安
一、程序運行效果圖: 二、代碼實現 1、main.xml 2、MainActivity 1