工廠模式是創(chuàng)建性模式,總共分為三種:簡(jiǎn)單工廠模式肺孤,工廠方法模式罗晕,抽象工廠模式
什么是工廠模式?
定義一個(gè)用戶創(chuàng)建對(duì)象的借口赠堵,讓子類決定實(shí)例化哪一個(gè)類
為什么要用工廠模式小渊?
需要生成復(fù)雜對(duì)象的地方,都可以使用工廠方法模式茫叭。用new就能創(chuàng)建的對(duì)象不需要使用工廠模式酬屉,因?yàn)槭褂霉S模式就要增加一個(gè)工廠類,增加了系統(tǒng)復(fù)雜度揍愁。
- 降低了對(duì)象之間的耦合度呐萨,代碼結(jié)構(gòu)清晰,對(duì)調(diào)用者隱藏了產(chǎn)品的生產(chǎn)過(guò)程莽囤,生產(chǎn)過(guò)程改變后谬擦,調(diào)用者不用做什么改變,易于修改烁登。
- 易于拓展怯屉,要增加工廠和產(chǎn)品都非常方便,直接實(shí)現(xiàn)接口饵沧,不用修改之前的代碼。
具體代碼實(shí)現(xiàn)
模式1
定義一個(gè)抽象產(chǎn)品
public abstract class Product {
/**
* 產(chǎn)品類的抽象方法赌躺,由具體的產(chǎn)品類來(lái)實(shí)現(xiàn)
*/
public abstract void mecthod();
}
具體的產(chǎn)品實(shí)現(xiàn)
public class ProductA extends Product{
@Override
public void mecthod() {
System.out.println("產(chǎn)品A");
}
}
public class ProductB extends Product{
@Override
public void mecthod() {
System.out.println("產(chǎn)品B");
}
}
定義抽象的工廠
public abstract class Factory {
/**
*
* @param cls 產(chǎn)品對(duì)象類型
* @param <T> 具體的產(chǎn)品類型
* @return
*/
public abstract Product createProduct();
}
具體產(chǎn)品的工廠實(shí)現(xiàn)
public class ConcreteFactory extends Factory {
@Override
public Product createProduct() {
return new ProductA();
}
}
實(shí)際調(diào)用實(shí)現(xiàn)
Factory factory = new ConcreteFactory();
Product product = factory.createProduct();
product.method();
這樣就可以生產(chǎn)出一個(gè)產(chǎn)品ProductA狼牺。
如果想生產(chǎn)出產(chǎn)品ProductB的話,在createProduct里修改返回ProductB就行了
public class ConcreteFactory extends Factory {
@Override
public Product createProduct() {
return new ProductA();
}
}
模式2
通過(guò)反射來(lái)了解到底要生產(chǎn)哪個(gè)產(chǎn)品
public abstract class Factory {
/**
*
* @param cls 產(chǎn)品對(duì)象類型
* @param <T> 具體的產(chǎn)品類型
* @return
*/
public abstract <T extends Product> T createProduct(Class<T> cls);
}
public class ConcreateFractory extends Factory {
@Override
public <T extends Product> T createProduct(Class<T> cls) {
Product product = null;
try {
product = (Product) Class.forName(cls.getName()).newInstance();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) product;
}
}
Factory factory = new ConcreateFractory();
Product product = factory.createProduct(ProductA.class);
product.mecthod();
這樣的話在調(diào)用的時(shí)候傳入什么產(chǎn)品就生產(chǎn)出什么產(chǎn)品
模式3
也可以為每個(gè)產(chǎn)品都創(chuàng)建一個(gè)具體的工廠類礼患,例如:
public class ConcreteFactoryA extends Factory {
@Override
public Product createProduct() {
return new ProductA();
}
}
public class ConcreteFactoryB extends Factory {
@Override
public Product createProduct() {
return new ProductB();
}
}
這樣就是要生產(chǎn)哪個(gè)就調(diào)用哪個(gè)工廠
靜態(tài)工廠模式
當(dāng)確定工廠類只有一個(gè)的時(shí)候 可以通過(guò)靜態(tài)方法的形式創(chuàng)建對(duì)應(yīng)的產(chǎn)品
public class Factory{
public static Product createProduct(){
return new ProductA();
//return new ProductB();
}
}
以上就是對(duì)與工廠模式的解釋 是钥,整體來(lái)說(shuō)工廠模式的缺點(diǎn)應(yīng)該就是會(huì)讓系統(tǒng)結(jié)構(gòu)復(fù)雜化了掠归,如果是非常簡(jiǎn)單的結(jié)構(gòu)就不需要使用這種模式了。