工廠的作用相當于幫助我們完成實例化的操作。
優勢1:一般在代碼中,實例化一個類A是直接new A(),假如類A是一個完全獨立的類,沒有相似類,則沒有必要使用工廠模式,直接new A()沒有毛病。但是如果類A本身有一個相似類B,而在實際使用類A或者類B的實例時,如果關心的是類A與類B的共同部分,則工廠模式就可以體現出它的優勢。
比如調用數據庫,所有的數據庫都有插入操作insert:
interface DatabaseOperate{
?? ?public void insert(Mydata data){
?? ?}
}
然而,不同的數據庫的具體實現方法是不同的
class MySQLOperate implements DatabaseOperate{
?? ?@Override
?? ?public void insert(Mydata data){
?? ??? ?...
?? ?}
}
class OracleOperate implements DatabaseOperate{
?? ?@Override
?? ?public void insert(Mydata data){
?? ??? ?...
?? ?}
}
然而真正使用插入操作的時候,我們需要關心的并不是插入操作如何具體實現,我們只需要對數據庫進行插入操作就行了,所以使用工廠類對具體實現方法進行整合
class MyDBFactory{
?? ?
?? ?public static int MySQL=1;
?? ?public static int Oracle=2;
?? ?public static int DBType = MySQL;
?? ?public static DatabaseOperate getDatabase(){
?? ??? ?if(DBType=MySQL){
?? ??? ??? ?return new MySQLOperate();
?? ??? ?}
?? ??? ?
?? ??? ?if(DBType=Oracle){
?? ??? ??? ?return new OracleOperate();
?? ??? ?}
?? ?}
}
這樣我們在調用的時候就可以忽略具體實現方法,而直接進行調用。
void insert(Mydata data){
?? ?DatabaseOperate operate = MyDBFactory.getDatabase();
?? ?operate.insert(data);
}
在這里,工廠模式相當于實現了下面的代碼。
class MySQLOperate{
?? ?public void insert(Mydata data){
?? ??? ?...
?? ?}
}
void inert(Mydata data){
?? ?MySQLOperate opertate = new MySQLOperate();
?? ?operate.insert(data);
}
如果這樣編寫,在進行數據庫切換時,需要重新寫insert()方法,尤其是在很多地方用到與insert()方法相同的操作時,要在很多地方new MySQLOperate這個類,修改起來跟家麻煩。
這個優勢有兩個應用場景:
一個是上述的例子,可以動態的使用代碼,只需要修改部分配置。
還有一個是在一個大類需要很多小類的時候,每種小類負責完成一部分工作,但是有不同的完成方法,大類只需要設置條件,工廠自動返回合適的小類。
優勢2:初始化封裝。在需求一個類的實例時,假如需要一個相同屬性的實例,每次初始化的操作是一樣的,用工廠模式可以對初始化進行封裝,簡化操作。
比如有一個類Car
class Car{
?? ?private String brand;
?? ?private double price;
?? ?public Car(String brand,double price){
?? ? ? ?this.brand=brand;
? ? ? ? ? ? this.price=price;?? ?
?? ?}
}
我們在實例化一個Audi的時候,賦值brand為Audi,price為30000
void createCar(){
? ? Car car1 = new Car("Audi",300000);
? ? Car car2 = new Car("Audi",300000);
}
每次要用到Audi這個實例的時候,都要給定兩個初始化參數,"Audi"和30000,然而如果確定了brand為Audi的話,price隨之確定為300000,每次實例化的時候要輸入多個( 這里是兩個)參數,會顯得很麻煩。
所以我們這里使用工廠模式
public CarFactory
{
? ? private Map<String,Car> cars = new HashMap<>();
?
? ? static
? ?{
? ? ? ? cars.put("Audi",new Car("Audi",300000));
? ? }
? ??
? ? public static Car getCar(String name)
? ?{
? ? ? ? return cars.get(name);
? ? }
?
}
然后我們在實例化Audi時,只需要輸入他的名稱就可以得到參數完整的Audi
void createCar(){
? ? Car car1 = CarFactory.getCar("Audi");
? ? Car car2 = CarFactory.getCar("Audi");
}
這樣大大簡化了實例化時的初始化設置。
---------------------?
作者:zinsserzc?
來源:CSDN?
原文:https://blog.csdn.net/qq_28859325/article/details/60580578?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!