设计模式__工厂模式

定义:工厂模式定义了一个接口,让使用者更简洁,正确的实例化对象。

用处:工厂模式适合较为复杂的对象的创建。但是其实工厂模式没有用的那么模块化,我们平时看到的好多源码就是工厂模式。

例子:在一个产品详情页面,一个产品的状态有好几种,没有购买,购买了。。。我们可以用不同的产品来封装不同的状态,这样这些状太更加整洁,而不是在很多的if-else中凌乱。

  先定义一个状态的抽象类,来约束子类封装不同状态。(这是工厂模式的产品基类)

public abstract class ViewStatus {

    public abstract void setStatus(String statusDes);

}

然后,定义该产品不同的状态(不同的产品)

public class StatusOne extends ViewStatus {

    @Override
    public void setStatus(String statusDes) {
        System.out.println("没购买:"+statusDes);
    }

}

购买了的状态:

public class StatusTwo extends ViewStatus {

    @Override
    public void setStatus(String statusDes) {
        System.out.println("购买:" + statusDes);
    }

}

接下来该工厂基类了

public abstract class Factoy {

    public abstract ViewStatus createStatus();

}

实例化不同的状态的工厂

/**
 * 没有购买的工厂
 */
public class StatusOneFactor extends Factoy {

    @Override
    public ViewStatus createStatus() {
        return new StatusOne();
    }
}
/**
 * 购买的状态
 */
public class StatusTwoFactor extends Factoy {
    @Override
    public ViewStatus createStatus() {
        return new StatusTwo();
    }
}

使用该工厂模式:

        Factoy factoy = new StatusOneFactor();
        ViewStatus statusOne = factoy.createStatus();
        statusOne.setStatus("购买了!");

        Factoy factoy1 = new StatusTwoFactor();
        ViewStatus statusOne1 = factoy1.createStatus();
        statusOne1.setStatus("没购买!");

总结:实例化需要的状态工厂,然后取出该状态,最后去使用就好了。这个例子是多工厂模式,当我们的工厂只需要一个的时候可以简化工厂模式的父类,做一个静态工厂。(当然那些只有一个工厂的有点不符合对修改关闭)

工厂模式的优点:

  1. 我们有一堆不同状态的类需要创建时,我们可以使用工厂模式。因为他可以很好的封装这些状态和封装创建,使用起来方便。
  2. 可以封装创建比较麻烦的类,这样不需要使用者去了解类中的实现。
  3. 符合设计模式规则,对拓展开放最修改关闭。

 案例

     1.安卓中我们的activity,其实就是谷歌工程师已经封装好的工厂模式,我们只需要每次创建不同的产品,即继承Activity的不    同页面。

 public Activity newActivity(ClassLoader cl, String className,
            Intent intent)
            throws InstantiationException, IllegalAccessException,
            ClassNotFoundException {
        return (Activity)cl.loadClass(className).newInstance();
    }

      其实,就是用反射做的工厂。给frameWork返回我们的不同activity。我们可以将工厂类稍微修改一下,优点就是工厂类不需要对不同产品都去做个工厂类。缺点:反射的缺点,运行较慢。

 public <T extends ViewStatus> T createStatues(Class<T> tClass){
        ViewStatus viewStatus = null;

        try {
            viewStatus= (ViewStatus) Class.forName(tClass.getName()).newInstance();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return (T)viewStatus;
    }

      2.我们平时每一个activity封装自己的跳转方法,既可以减少代码冗余,也可以表明该类跳转需要的不同参数。

 public static void toActivity(Context context){
        Intent intent=new Intent(context,HaAcitivity.class);
        context.startActivity(intent);
    }

      这些都是工厂模式的一种实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值