您的位置:首页 > 移动开发 > Android开发

android 设计模式:工厂模式

2016-12-06 17:01 330 查看
放在开头:了解一个设计模式,首先也是最重要的就是了解它的设计依据

工厂模式按抽象的角度,层次不同分为:

抽象工厂方法   抽象工厂

先声明一点:下面提到的抽象类包括   接口,抽象类

抽象工厂方法设计依据:

一个抽象产品类,多个具体产品

一个抽象工厂类,多个具体工厂

下面用代码具象化的展示下

抽象产品,工厂

public interface Product  {

public void flower();

}

public interface Factory {

public Product getFlower();

}

多个具体产品,具体工厂

public class JuHua implements Product {

@Override

public void flower() {

Log.i("shan","flower: ju hua");

}

}

public class MeiGui implements Product {

@Override

public void flower() {

Log.i("shan","flower: mei gui");

}

}

多个工厂,一个工厂只生产一种产品

public class JuHuaFactory implements Factroy {

@Override

public Product getFlower() {

return new JuHua();

}

}

public class MeiGuiFactroy implements Factroy {

@Override

public Product getFlower() {

return new MeiGui();

}

}

使用的时候你你需要那种花,就实例化对应的工厂

上面就是标准的工厂方法,不知到大家看着感觉怎样,我感觉挺繁琐的。如果产品多了,那得多少个对应的工厂啊。。。

所以下面再介绍一个变种,核心思想时工厂生产返回的产品类型是个泛型。且看我接下来对抽象工厂类的修改

public interface Factroy {

public <T extends Product> T getFlower(Class<T> clazz);

}

public class FlowerFactroy implements Factroy {

@Override

public <T extends Product> T getFlower(Class<T> clazz) {

Product flower;

flower = (Product) Class.forName(clazzz.getName()).newInstance();

return (T) flower;

}

}

OK   就这样

抽象工厂模式

多个抽象产品,多个具体产品

一个抽象工厂,多个具体工厂

抽象工厂方法模式中所有的产品都是由一个抽象类衍生的,工厂模式可以生产更多新产品,产品的行为完全可以你自己定义

好的,上例已抽象出一个flower的Product接口(起名为Flower会更好),现在我重新抽象一个tree的Tree接口

public interface Tree {

public void tree();

}

改一下抽象工厂接口

public interface Factroy {

public <T extends Product> T getFlower(Class<T> clazz);

public <T extends Tree> T getTree(Class<T> clazz);

}

好了,实际运用的时候只要实现工厂类,产生各种具体的工厂,里面的产品可以自由组合

比如,现在我具体化一个生产菊花和松树的工厂JuHuaSongShuFactroy

public class JuHuaSongShuFactroy implements Factroy {

@Override

public <T extends Product> T getFlower(Class<T> clazz) {

Product flower;

flower = (Product) Class.forName(clazz.getName()).newInstance();

retrun (T) flower; 

}

@Override

public <T extends Tree> T getTree(Class<T> clazzz) {

//具体的松树这个产品具体实现类,大家自己脑补一下

Tree tree;

tree = (Tree) Class.forName(clazz.getName()).newInstance();

return (T) tree;

}

}

好了各种组合的工厂,你自己去选择把,是不是很方便,哈哈

这种模式特定的场景也会去修改源码结构,这种弊端就不讲了,捂脸。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  工厂模式