文档章节

设计模式:简单工厂模式(静态工厂方法模式)

_无问西东
 _无问西东
发布于 08/18 11:14
字数 596
阅读 7
收藏 0

简单工厂的构成包括三个角色:

1)抽象产品类

2)具体产品类(继承抽闲产品类)

3)工厂类(生产具体产品)

 

具体代码实现

1、抽象产品类


/**
 * 抽象类
 */
public abstract class Car {
    /**
     * 产品抽象方法,将会由具体产品类实现
     */
    public abstract void driving();
}

2、具体产品类


/**
 * 具体产品类BenZCar
 */
public class BenZCar extends Car {
    @Override
    public void driving() {
        System.out.println("BenZCar is Driving!!!");
    }
}




/**
 * 具体产品类BMWCar
 */
public class BMWCar extends Car {
    @Override
    public void driving() {
        System.out.println("BMWCar is Driving!!!");
    }
}





3、工厂类


/**
 * 简单工厂类
 */

public class CarFactory {

    public static Car create(String type) {
        Car car = null;
        switch (type) {
            case "bmw":
                car = new BMWCar();
                break;
            case "benz":
                car = new BenZCar();
                break;

        }
        return car;
    }


}

4、调用(这里使用AndroidStudio代码测试,如果是java的可以在main函数中测试)


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.id_bmw).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CarFactory.create("bmw").driving();
            }
        });

        findViewById(R.id.id_benz).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CarFactory.create("benz").driving();
            }
        });
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/id_bmw"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="制造一个BWM汽车"
        android:layout_marginBottom="15dp"/>

    <Button
        android:id="@+id/id_benz"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="制造一个Benz汽车"
        android:layout_marginBottom="15dp"/>

</LinearLayout>

5、界面

 

6、测试结果

08-20 10:59:55.001 3660-3660/com.tech.aile.designpatterns I/System.out: BMWCar is Driving!!!
08-20 10:59:56.573 3660-3660/com.tech.aile.designpatterns I/System.out: BenZCar is Driving!!!
 

7、使用场景

1)工厂类创建的具体对象要较少,不适用子类过多,子类层级过深的场景。

2)看客户只需要传入什么类型的参数,不用关注创建对象的逻辑。

 

8、优点

根据参数类型获取实例,不用关注具体细节,降低了耦合

9、缺点

具体的产品类型在编译期间已经确定,不能更改,如果需要新增具体产品就需要修改工厂类,添加新具体产品类,违背了封闭开放原则;

简单工厂必须知道所有需要生产具体产品类,不适用子类过多,子类层级过深的场景

 

© 著作权归作者所有

共有 人打赏支持
_无问西东
粉丝 1
博文 55
码字总数 90507
作品 0
朝阳
高级程序员
私信 提问
php各种设计模式简单实践思考

前言 我一直觉得什么框架,版本,甚至语言对于一个coder来说真的不算什么,掌握一个特别高大上的一个框架或者是一个新的,少众的语言真的不算什么,因为你可以,我要花时间也可以,大家都是这...

michaelgbw
2016/06/13
0
0
JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模式、工厂方法模式、单例设计模式之饿汉式和懒汉式、Runtime类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52717096 JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模...

Aduroidpc
2016/10/01
0
0
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信
03/22
0
0
Java设计模式之工厂方法模式与抽象工厂模式

一、前期回顾 上一篇《Java设计模式之单例模式》详细介绍了单例模式,介绍了单例模式的使用场景,优缺点,同时也写了两种常见的单例模式写法,懒汉式单例模式和饿汉氏单例模式,当然,单例模...

木木匠
11/09
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho
04/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用any-loader封装jQuery的XHR —— 随便写着玩系列

哎,都说没人用JQuery啦,叫你别写这个。 其实我也是好高骛远使用过npm上某个和某个很出名的XHR库,嗯,认识我的人都知道我喜欢喷JQ,以前天天喷,见面第一句,你还用JQ,赶紧丢了吧。但我也...

曾建凯
今天
1
0
聊聊storm的AggregateProcessor的execute及finishBatch方法

序 本文主要研究一下storm的AggregateProcessor的execute及finishBatch方法 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout......

go4it
今天
3
0
大数据教程(7.5)hadoop中内置rpc框架的使用教程

博主上一篇博客分享了hadoop客户端java API的使用,本章节带领小伙伴们一起来体验下hadoop的内置rpc框架。首先,由于hadoop的内置rpc框架的设计目的是为了内部的组件提供rpc访问的功能,并不...

em_aaron
今天
5
0
CentOS7+git+github创建Python开发环境

1.准备CentOS7 (1)下载VMware Workstation https://pan.baidu.com/s/1miFU8mk (2)下载CentOS7镜像 https://mirrors.aliyun.com/centos/ (3)安装CentOS7系统 http://blog.51cto.com/fengyuns......

枫叶云
昨天
3
0
利用ibeetl 实现selectpicker 的三级联动

1. js 直接写在html页面上面,ibeetl 就可以动态地利用后台传上来的model List ,不需要每次点击都要ajax请求后台 2. 使用selectpicker 的时候,除了对selecct option的动态处理后,还需要 $("#...

donald121
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部