博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA 设计模式工厂方法模式
阅读量:6479 次
发布时间:2019-06-23

本文共 2997 字,大约阅读时间需要 9 分钟。

工厂方法模式的介绍

工厂方法模式,是创建性设计模式之一,工厂方法模式是一种结构简单的模式,其在我们开发时应用很广泛

工厂方法模式的定义

定义一个用于创建对象的接口,让子类决定实例化那个类

工厂方法模式的使用场景

在任何需要生成复杂对象的地方,都可以使用工厂方法模式,复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式

工厂方法模式的UML图

下面我们用具体的例子来看

//抽象产品类public abstract class Product {    /**     *产品类的抽象方法     * 由具体的产品实现     */    public abstract String method();}1234567891011复制代码
public  class ProductA extends Product{    @Override    public String method() {       return "我是产品A";    }}123456复制代码
public class ProductB extends Product {    @Override    public String method() {        return "我是产品B";    }}123456复制代码
public  abstract class Factory {    /**     * 抽象工厂方法     * 具体生产什么由子类去实现     * @return 具体的产品     */    public abstract Product createProduct();}123456789复制代码
public class ProductFactory extends Factory {    @Override    public Product createProduct() {        return new ProductB();        //return new ProductA();    }}1234567复制代码
public class FactoryActivity extends BaseActivity {    private TextView mTextView;    @Override    public int setMainView() {        return R.layout.activity_factory;    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mTextView = (TextView) findViewById(R.id.factory_text);        ProductFactory productFactory = new ProductFactory();        Product product = productFactory.createProduct();        mTextView.setText(product.method());    }}12345678910111213141516171819复制代码

这里的几个角色都很简单,主要分为四大模块,一个是抽象工厂,其为工厂方法模式的核心,二是具体工厂,其实现了具体的业务逻辑,三是抽象产品,是工厂方法模式创建对象的父类,四是具体产品,为实现抽象产品的某个具体产品的对象

上述代码如果想要切换产品的话需要

public class ProductFactory extends Factory {    @Override    public Product createProduct() {        return new ProductB();        //return new ProductA();    }}1234567复制代码

这种方式比较常见,需要哪个产品就生产哪一个,有时候也可以利用反射跟简洁的来生产具体产品对象,此时需要传入一个Class来决定是哪一个产品类,代码如下

public class ProductFactory extends Factory {    @Override    public 
T createProduct1(Class
cls) { Product p= null; try { p = (Product) Class.forName(cls.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T) p; }}12345678910111213复制代码

调用

public class FactoryActivity extends BaseActivity {    private TextView mTextView;    @Override    public int setMainView() {        return R.layout.activity_factory;    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mTextView = (TextView) findViewById(R.id.factory_text);        ProductA productA = new ProductA();        ProductFactory productFactory1 = new ProductFactory();        ProductA product1 = productFactory1.createProduct1(productA.getClass());        mTextView.setText(product1.method());    }}1234567891011121314151617181920复制代码

除了上面两种之外还可以为每个具体的产品,定义一个具体的工厂,这样的成为多工厂模式,这里就不过多的叙述了

总结:

总的来说,工厂方法模式是一个很好的实际模式,在本文多处地方都有对其有点的总结,但是缺点也是难以避免的,每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然导致类结构的复杂化,所以说,在某些情况比较简单时,是否需要使用工厂模式,需要权衡利弊。

转载地址:http://wjzuo.baihongyu.com/

你可能感兴趣的文章
你的leader还在考核你的千行代码Bug率吗?
查看>>
多块盘制作成一个lvm
查看>>
InnoDB多版本
查看>>
贪心算法 - 活动选择问题
查看>>
独立思考与输入、吸收
查看>>
es6 includes(), startsWith(), endsWith()
查看>>
关于azkaban上传job压缩包报错问题的解决方案
查看>>
JS版日期格式化和解析工具类,毫秒级
查看>>
flask-login登录原理
查看>>
百度人脸对比
查看>>
Linux内存管理 一个进程究竟占用多少空间?-VSS/RSS/PSS/USS
查看>>
苹果AppStore如何申请加急审核
查看>>
SpringBoot 使用Swagger2打造在线接口文档(附汉化教程)
查看>>
Mysql一个表编码的坑,mark一下
查看>>
JS动态事件绑定问题
查看>>
在WPF应用程序中利用IEditableObject接口实现可撤销编辑的对象
查看>>
android 8 wifi wifi 扫描过程
查看>>
phalcon的save方法保存失败?
查看>>
获取任意链接文章正文 API 功能简介
查看>>
js中Math.random()生成指定范围数值的随机数
查看>>