工厂方法模式
工厂方法模式是我们开发中使用最广泛的设计模式之一,不说无聊的定义,直接看例子
一、工厂方法模式的四大模块:
1、抽象工厂 --- 一个抽象类,有一个生产产品(女朋友)的抽象方法,由具体工厂实现。
2、具体工厂 --- 继承抽象工厂类,生产何种产品(你是要国产还是要日韩还是要欧美由你定)的具体实现。
3、抽象产品 --- 一个抽象类,提供一个抽象方法,由具体产品实现。
4、具体产品 -- 哈哈,你懂的。
以上解释看不懂?没关系,看代码:
二、工厂方法模式的通用代码
1、抽象工厂类
//抽象工厂
public abstract class Factory {
public abstract Product createProduct();
}
2、具体工厂
public class ProductFactory extends Factory {
@Override
public Product createProduct() {
return new GirlFriendProduct();
//return new BoyFriendProduct();
}
}
3、抽象产品
public abstract class Product {
public abstract void createProduct();
}
4、具体的产品
//生产女朋友
public class GirlFriendProduct extends Product {
@Override
public void createProduct() {
System.out.println("product======冰冰");
}
}
//生产男朋友
public class BoyFriendProduct extends Product{
@Override
public void createProduct() {
System.out.println("product======小鲜肉");
}
}
接下来看看在代码中的使用
public class FactoryActivity extends AppCompatActivity {
private Product mProduct;
private Factory mFactory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_factory);
mFactory = new ProductFactory();
mProduct = mFactory.createProduct();
}
//生产一个朋友
public void clickCreate(View view) {
mProduct.createProduct();
}
}
点击按钮,生产一个朋友,看看控制台日志输出:
product======冰冰
好了,到此为止,一个通用的工厂方法模式的代码就写完了。不过可能有人说了,老子喜欢男的啊,这也好办啊,你在ProductFactory类里,返回 BoyFriendProduct 就行了(参见注释掉的代码),这时你再生产一个朋友看看,控制台输出如下:
product======小鲜肉
好了,大胸弟,你要的小鲜肉也有了,尽情的去玩耍吧。
这时比较常见的方式,你需要女朋友就生产女朋友,反之你就生产男朋友,其实还可以通过泛型来简化一下代码,改造后的代码如下:
//抽象工厂 具体生产什么产品由子类实现
public abstract class Factory {
public abstract <T extends Product> T createProduct(Class<T> clz);
}
具体工厂:
//具体工厂
public class ProductFactory extends Factory {
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product product = null;
try {
product = (Product) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) product;
}
}
此时再看看在代码中的使用,这时你只需根据你需要的product传入相应的类就哦了:
mFactory = new ProductFactory();
mProduct = mFactory.createProduct(BoyFriendProduct.class);
mProduct.createProduct();
以上通过泛型和反射简化了代码,不过假如我们的工厂只生产一种产品的时候(比如只生产女朋友),我们还可以再简化一下代码,我们可以把factory改为普通的类(非抽象),然后在factory类里直接返回产品并把方法改为静态即可,这样的方式又称为简单工厂模式。
public static Product createProduct(){
return new GirlFriendProduct();
}
PS:工厂设计模式是一个很好的设计模式,它的缺点是每当工厂添加一个产品时(比如还能生产苍老师,哈哈),我们要新编写一个相应的产品类,在实际的开发中,可以根据实际情况自行选择吧。
最后,生产女朋友讲完了,下一篇会讲一下 带你勾搭妹子的职责连模式,欢迎关注,谢谢。
本篇项目demo地址,欢迎start
https://github.com/lxykad/design_mode