一般來說 原型方法主要使用于快速生成和已存在對象基本一致的對象。
一般典型的例子是細胞分裂和孫悟空變換出N的小猴子
不過我這里舉一個在GUI設計過程的例子
假如一個面板上的同質按鈕,他們僅文本不同,代表的邏輯不同,其他信息是完全一致的,比如皮膚,邊框,大小等
按照一般方法可能會這樣構造面板
Button* btn1 = new Button();
btn1->SetSize(..);
btn1->SetBorder(..);
btn1->SetListener(..);
btn1->SetVisible(true);
btn1->SetParent(panel);
btn1->SetColor(
)
Button* btn2 =..
當然還有其他按鈕:)
是不是很煩?
借助原型模式
可以大大的簡化!
比如:
Button *btn1 = new Button(panel);
Button *btn2= btn1->Clone();
Button *btn3= btn1->Clone();
Button *btn4= btn1->Clone();
然后只要設置各個按鈕對應的文本即可
為了使用原型方法我們需要做的僅僅是
給對象增加Clone接口和其實現即可
比如:
class AbstractWidget
{
public:
virtual AbstractWidget* Clone() = 0;

};
需要說明的是原型一般使用的是淺拷貝
今天晚上試著在個人電腦上搭建了Android就說說具體的步驟吧
1.首先下載eclipse包。地址:http://download.actuatechina.com/eclipse/technology/epp/downloads/release/helios/SR2/eclipse-java-helios-SR2-win32.zip
2.解壓,點擊eclipse.exe 出現錯誤提示沒有安裝java包
3.下載java包。地址:http://download.oracle.com/otn-pub/java/jdk/6u25-b06/jdk-6u25-windows-i586.exe
4.點擊安裝。完成后啟動eclipse
5.點擊菜單Help->install new software 增加新的repository,名字隨便起個
地址為:https://dl-ssl.google.com/android/eclipse/
安裝ADT
6.安裝完成后restart eclipse會發現window菜單多了一欄:Android SDK and AVD Manager
7.下載 Android sdk 地址為:http://dl.google.com/android/android-sdk_r08-windows.zip
8.解壓,點擊其中的SDK Manager.exe 下載其他關鍵包
9.點擊eclipse window perfercences 中的android設置android sdk路徑
成功后下面的列表框會出現安裝信息比如:Target name,Vendor 和 Paltform API
10.點擊Apply
11.最后還需要設置模擬器 具體為打開Android SDK and AVD Manager 點擊左側的Virtual Devices
然后點擊右側的New按鍵 按照要求填入信息即可
12.現在就可以編寫Android程序并在模擬器上跑了
不過模擬器啟動很慢 一般都是在真機上做測試
早在2008年底我就想做一套完整的GUI庫,搞笑的是當時我以為游戲中的所有控件都是
使用win32做的。看了Opengl游戲編程附帶的代碼,才搞清楚了不是這個樣子的滴(感覺當時很膚淺哈哈)
之后我就打算自己開發一個玩玩,盡管我很努力,但是水平太菜,做不出來(不過我有一個特點就是說干就干,這點很贊)
大致到了2009年年底,技術積累達到了一定的高度,也查看了很多的gui庫,基本上能夠做出來成型的GUI了(至于能不能用,這是一個問題)
去年中期,才拿出了一個成套的GUI,雖然不是特別好,但是基本能用,另外對GUI各塊機理也有了很好的認識(比如字體渲染,控件架構,對象序列化,事件處理等)
但是這塊有幾個問題:
1。對象序列化是基于模板的,這塊有益處也有弊端
2。只能支持控件換膚,不能支持完備的控件序列化
3。.做出來的控件太丑了-不具有漂亮的臉蛋
現在決定做一個獨立,開源,完備,漂亮,方便,易用,容擴展的一個GUI
說他獨立:是考慮把這個做成一個類似于個人做的音頻引擎,不依賴于游戲引擎
說他開源:這個好解釋
說他漂亮:就是做出來的界面一定要美觀,否則就是一坨屎
說他易用:是指容易使用,包括支持控件資源皮膚資源等
說他易擴展:是指其由若干模塊構成,容易增加新的接口,不依賴于具體渲染API和平臺
當然編輯器也應該有的
在開發過程中將詳細講解GUI開發中遇到的各類問題,包括所有控件,接口,事件處理,對象布局,設計的設計模式等細節
同時盡可能得附上代碼
如果感覺寫的不對請隨時指正
另外:今年看了大量的QT和Android例子,吸收了不少養分
關于開發時間:慢慢來吧,興趣所致,走走看吧
之前開發的引擎不打算再做了,涉及面太大,精力太少
在可預見的時間內,我想繼續維護音頻API,GUI庫和另外一個軟件
接上文:設計模式
-簡單工廠 http://www.shnenglu.com/gaimor/archive/2011/05/02/145498.html 簡單工廠是根據傳入要求決定生產那類產品,其工廠只有一個
在簡單工廠基礎之上,如果一個工廠對應一個產品則形成了工廠方法
interface Product
{
public void Call();
};
public class Product1 implements Product
{
public void Call()
{}
};
public class Product2 implements Product
{
public void Call()
{}
};
interface ProductFactory
{
public Product GetProduct();
};
public class ProductFactory1 implements ProductFactory
{
public Product GetProduct()
{
return new Product1();
}
}
public class ProductFactory2 implements ProductFactory
{
public Product GetProduct()
{
return new Product2();
}
}
這樣使用
ProductFactory factory1 = new ProductFactory1();
Product p1 = factory1.GetProduct();
ProductFactory factory2 = new ProductFactory2();
Product p2 = factory2.GetProduct();
可以看出工廠方法中工廠和產品總是一一對應的
一個工廠只能生產一個產品
很顯然工廠方法最大的弊端就在這里.
使用的場合:
一個對象希望由子對象來指定它所創建的對象時,可以使用工廠方法PS:系統那個總結下設計模式
這段時間在學習Android,也要學點jav方面的編程知識
乘著這個機會,俺就總結下學過和使用過的設計模式,并使用java寫下
先說簡單工廠
簡單工廠屬于工廠模式的一種,不過似乎不在GOF模式之列.
一句話描述:簡單工廠就是根據給定要求生成給定對象
簡單的java版本代碼如下:
public interface Product
{
abstract public void Call();
};
public Pen implements Product
{
public void Call()
{
}
};
public Book implements Product
{
public void Call()
{
}
};
public clas Factory
{
public Product CreateProducrt(String name)
{
if(name.equals("Pen"))
return Pen.class.newInstance();
else if(name.equals("Book"))
return Book.class.newInstance();
return null;
}
};
簡單工廠就是根據輸入標簽返回給定的對象實例
很顯然,簡單工廠的主要缺陷就在于:如果需要增加一個新的產品那就需要修改其產品生成函數
另外,如果把工廠和產品對象合二為一就變成了如下的形式:
public class Object
{
public static ObjectCreateObject(String name);
other function.
};
這類似于MFC中CObject
簡單工廠的一個使用例子如下(之前我寫的GUI):
class WidgetFactory
{
public:
Widget* CreateWidgetByName(const std::string& name);
};
在這里如果傳入Spin則返回一個new Spin,傳入一個Slider則返回一個new Slider對象
如果我增加一個新的Widget對象,則需要把CreateWidgetByName函數修改下(當然可以使用Object::CreateObject(name)函數,只是返回的對象需要做類型轉換,原則一致)
下篇說說抽象工廠和工廠方法吧
之前在博客園見到過別人發的關于Android的帖子,當時只記得是關于手機開發的。
沒想到現在灑家也要學這個了。
不過還好經過1周多的學習,感覺Android還是很簡單的。
Android的基本概念
1.Activity
2,Intent
3.Content Privoder
4.BroadCast Revicer.
5..
接上文.
Tremolo音效比較酷的音效,聽上去感覺是使用電子樂器演示的。
從感官上將Tremolo(顫音)音效是重擊一個音符然后快速提高,減小音量
下面是顫音音效的幾個參數:
1.深度控制:用來控制音量增減速度
2.閾值數據:說明控制音量的頻率值
3.波形
其基本數學表達式為:
data = data * (1.0 + depth * sin(k* rate * index));
簡易的c++代碼如下:
class Tremolo : public AudioEffect
{
public:
static double def_depth;
static double def_rate;
double depth;
double rate;
double k;
Tremole();
std::vector<float> Filter(const std::vector<float>& _data)
{
data = _data;
for(int i = 0; i < data.size();i++)
data[i] *= (1.0 + depth * sin(2.0 * PI * rate * i / k);
return data;
}
};
當然有java版本的化應該是如下這個樣子:
public class Tremolo extends AudioEffect
{
private static double final def_depth = ;
private static double final def_rate = ;
private double depth = def_depth;
private double rate = def_rate;
Tremolo()
{

}
double[] Filter(double[] _data)
{
int len = _data.length;
double[] ret = new double[len];
for(int i = 0;i<len;i++)
ret[i] = _data[i]*(1+depth*Math.Sin(2*Math.PI*rate*i/k));
return ret;
}
}
基本的源碼就這個樣子
不過有一個問題就是播放音效有少許雜音-不過不是大問題
之前做的音頻API都是使用的第三方的庫或者代碼
不過這段時間一直比較忙
沒什么時間來玩玩音頻引擎了
不過為了不至于本博客長草
我就整理下以前接觸過的音頻處理這塊吧
首先上一個簡單的音效基類吧
class AudioEffect
{
public:
virtual ~AudioEffect(){}
virtual std::vector<float> Filter(const std::vector<float>& data) = 0;
protected:
std::vector<float> data;
};
通過調用Filter就可以獲取給定pcm處理后的音效數據
然后再談下什么是Distortion音效
Distortion主要使用于電吉他等電子類樂器,
Distortion音效主要有以下參數:
1.edge 臨界值
2.gain 增益
3.低通剪切值(當然還有其他幾個參數,...)
其簡易化的音效處理原則就是
使用使用給定臨界值對原有數據做Clamp處理
簡單的例子如下:
#define DISTORTION_RATE 100.0
#define DISTORTION_THRESHOLD 0.4
class Distortion : public AudioEffect
{
public:
Distortion()
{
gain = DISTORTION_RATE;
value = DISTORTION_THRESHOLD;
}
std::vector<float> Filter(const std::vector<float>& data_)
{
this->data.clear();
for(int i = 0; i < data_.size(); i++)
{
float v = data_[i]*gain;
if(v > value)
v = value;
if(v < - value)
v = -value;
data.push_back(v);
}
reutrn data;
}
private:
float gain;
float value;
};
看上去似乎很簡單
那處理后的音效如何? 試試就知道了
接下來還有reverb,ring,echo,chorus等音效算法和音頻傅里葉變換等
等弄完了這些,音頻引擎也就該升級了(我早已構思好了下個版本的音頻API功能了)
下篇tremolo音效
包
import android.media.AudioManager;
獲取
AudioManager audiomanage = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
音量增大和減小(一個單位)
audiomanager.adjustVolum(AudioManager.ADJUST_LOWER,0);
audiomanager.adjustVolum(AudioManager.ADJUST_RAISE,0);
Styles是QT自帶的例子 - 主要展示的是QT程序界面風格方面的編程知識
1.程序調色板的獲取
使用QApplication中的靜態函數
QApplication::palette
palette有2個版本一個是給定的調色板,另外一個給定的調色板
對應的調用
QApplication::setPalette
就可以設置新的程序調色板
如果使用自定義的Palette就可以達到修改界面色調的目的
比如:
2.QStyleFactory對象
The QStyleFactory class creates QStyle objects.可以通過靜態函數QStyleFactory::key()獲取工廠所支持的風格名字列表(注意是列表,返回類型是QStringList)
當然可以通過函數cerate來生成新的風格指針
3.QComboBox 組合框
主要函數有以下幾個:
通過函數addItem增加新項
通過addItems增加新項列表
通過插槽綁定就可以傳遞響應了:
connect(combobox,SIGNAL(activated(QString)),this, SLOT(changeComBox(QString)));
其他三個可能會用到的函數
currentIndex,count, currentText
4.QT計時器
拿例子說下:
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(advanceProgressBar()));
timer->start(1000);
首先構造一個計時器 然后綁定計時器對象和槽函數
之后啟用計時器-每隔1秒鐘調用advaceProressBar函數
如果想停止計時器則調用stop函數即可
5.
QProgressBar進度條對象
基本的函數就那些
設置方向,當前值,最大值最小值,文本,可見性等等
progressBar = new QProgressBar;
progressBar->setRange(0, 10000);
progressBar->setValue(0);
其槽函數為
valueChanged ( int value )
6.單選按鈕QRodioButton
例子如下
topLeftGroupBox = new QGroupBox(tr("Group 1"));
radioButton1 = new QRadioButton(tr("Radio button 1"));
radioButton2 = new QRadioButton(topLeftGroupBox);
radioButton2->setText(tr("Radio button 2"));
radioButton3 = new QRadioButton(tr("Radio button 3"));
radioButton1->setChecked(true);
layout->addWidget(radioButton1);
layout->addWidget(radioButton2);
layout->addWidget(radioButton3);
似乎沒什么可說的
7.QTableWidget控件
The QTableWidget class provides an item-based table view with a default model.
需要說明的是如果要使用自定義類型,則需要使用QTableView而非QTableWidget.
tableWidget = new QTableWidget(this);
tableWidget->setRowCount(10);
tableWidget->setColumnCount(5);
不過感覺以后不會使用這個對象
8.QLineText
QT的單行輸入控件
具體函數有(似乎不需要說功能了)
QString text() const;
QString displayText() const;
int maxLength() const;
void setMaxLength(int);
bool isReadOnly() const;
void setReadOnly(bool);
bool isModified() const;
void setModified(bool);
9.
Q_INIT_RESOURCE(styles
);
加載資源文件
styles.qrc