Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android設計模式--簡單工廠模式

Android設計模式--簡單工廠模式

編輯:關於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));
	}
}


當然,簡單工廠在Android 源碼中有典型的運用:BitmapFactory

 

 

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;
    }
}


 

 

 

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved