设计模式学习-工厂方法模式

本文详细介绍了工厂方法模式的核心思想及其实现方式,包括抽象产品、具体产品、抽象工厂和具体产品工厂的概念,并给出了具体的代码示例。

工厂方法模式

来源>http://blog.youkuaiyun.com/lfdfhl/article/details/77977256

核心思想:将不同的产品交由各自的工厂生产,每个工厂生产特定的对象

工厂方法模式的4种角色

  • 抽象产品: 接口或抽象类,负责产品角色的定义
  • 具体产品: 实现抽象产品,实际操作对象
  • 抽象工厂: 对工厂的抽象,负责定义工厂角色的功能等
  • 具体产品工厂: 实现抽象工厂方法,负责生产对应的产品
  • 客户端:

看个例子

抽象产品

public interface Mobile(){
    public void call(String no);
}

抽象产品Mobile接口,定义了方法call(String):void,也即归纳了抽象产品的一个功能接口,实际应用时还有开机关机等接口

具体产品

public class StMobile implements Mobile {
    public StMobile() {
        System.out.println("标配mobile");
    }

    public void call(String no) {
        System.out.println("标配 calling... : " + no);
    }
}

public class ProMobile implements Mobile {
    public ProMobile() {
        System.out.println("高配mobile");
    }

    public void call(String no) {
        System.out.println("高配 calling...:" + no);
    }
}

抽象工厂

public interface MobileFactory {
    public Mobile createMobile();
}

对工厂类的一种抽象,工厂类具有方法createMobile():Mobile

具体产品工厂

StMobileFactory工厂实现了抽象工厂的方法,生产产品StMobile:

public class StMobileFactory implements MobileFactory {
    @Override
    public Mobile createMobile() {
        return new StMobile();
    }
}

ProMobileFactory 工厂实现了抽象工厂的方法,生产产品ProMobile:

public class ProMobileFactory implements MobileFactory {
    @Override
    public Mobile createMobile() {
        return new ProMobile();
    }
}

客户端

public class TestMain {
    public static void main(String[] args) {
        MobileFactory factory = new StMobileFactory();
        Mobile mobile = factory.createMobile();
        mobile.call("15098764321");

        /**
        factory = new ProMobileFactory();
        Mobile proMobile = factory.createMobile();
        proMobile .call("15098764321");
        **/
    }
}

分析

工厂方法模式简单工厂模式 的改进型,由同一个工厂生产产品改为由不同的工厂生产不同的产品,简单工厂模式不适合实际业务需求,因为存在潜在的类型变化,工厂方法模式改进了这一限制,当有新产品加入时,分2步走:
. 定义一个产品类实现抽象产品接口
. 定义一个产品工厂实现工厂接口
完成这2步,就可以在客户端用新的工厂生产新的产品

改进

这几篇关于工厂模式的短文是来源于别人的分享,里面加入了自己的理解,作为一个学习的整理,算转载吧,其中对工厂方法模式改进做的比较好的就是引入泛型,来源>http://blog.youkuaiyun.com/lfdfhl/article/details/77977256
泛型的引入可以减少工厂类的定义

抽象工厂

public interface GenericMobileFactory {
    public <T extends Mobile> T createMobile(Class<T> clazz);
}

具体产品工厂

public class GenericMobileFactoryImpl implements GenericMobileFactory {
    @SuppressWarnings("unchecked")
    @Override
    public <T extends Mobile> T createMobile(Class<T> clazz) {
        T mobile = null;
        try {
            mobile = (T) Class.forName(clazz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return mobile;
    }
}

引入泛型,利用反射,生成一个产品对象,然后强制转换为泛型参数类型

客户端

public class GenericTestMain {
    public static void main(String[] args) {
        GenericMobileFactory factory = new GenericMobileFactoryImpl();
        Mobile mobile = factory.createMobile(StMobile.class);
        mobile.call("15098764321");
        /*
        Mobile other = factory.createMobile(ProMobile.class);
        other.call("15098764321");
        */
    }
}

当有新的产品类型加入是,只需定义新的产品类,实现抽象产品接口,即可在客户端通过泛型的抽象工厂生产指定产品。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值