文档章节

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

_无问西东
 _无问西东
发布于 2018/08/18 11:14
字数 596
阅读 10
收藏 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
朝阳
高级程序员
私信 提问
设计模式Java Design Pattern-工厂方法模式FactoryMethod

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

勇敢写信
2018/03/22
0
0
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
设计模式之抽象工厂模式(创建型)

模式定义 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。 模式角色 抽象...

smileNicky
01/01
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

利用神器BTrace 追踪线上 Spring Boot应用运行时信息

概述 生产环境中的服务可能会出现各种问题,但总不能让服务下线来专门排查错误,这时候最好有一些手段来获取程序运行时信息,比如 接口方法参数/返回值、外部调用情况 以及 函数执行时间等信...

CodeSheep
40分钟前
3
0
OSChina 周四乱弹 —— 我想过年请假提前回家两天

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @clouddyy :#每日一歌# 分享王力宏的单曲《爱错》 《爱错》- 王力宏 手机党少年们想听歌,请使劲儿戳(这里) @Caremorele :这几天起床有点...

小小编辑
今天
59
5
Cookie 显示用户上次访问的时间

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.serv......

gwl_
今天
1
0
网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
今天
3
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部