设计模式之简单工厂

来源:互联网 发布:虚拟机安装mac 内存 编辑:程序博客网 时间:2024/05/16 07:31

1.简介

简单工厂又称静态工厂,功能是提供一个创建对象的实例功能,而无须关系心其具体的实现.

2.结构

上图所示,由几部分组成:
客户端:Client
工厂类:AppleFactory
苹果组件:Apple,RedApple,GreenApple

3.产生问题

请看下面的实例:
Apple apple = new RedApple();
这个类创建有问题吗?
当然没有,也只能说在代码层面没有问题!仔细想想,new RedApple()是有问题的!
接口的思想是"封装隔离",客户端根本不应该知道具体的实现方式RedApple!
问题来了:在Java编程中,出现只知接口不只实现,怎么办?要使用apple接口的API,但是不知如何实现,怎么办?

解决方案:

使用简单工厂解决,简单工厂解决的是如何获取接口的实现类,并且隐藏实现;
新建一个类,在这个类里面来创建接口实现,然后把创建好的接口实现返回给客户端,外部应用只需要根据
这个接口来获取相应的接口对象;

4.代码实现

1.创建苹果接口
public interface Apple { public void get(String name);}


2.创建红苹果
public class RedApple implements Apple { @Override public void get(String name) {  System.out.println("获取红苹果,我的名字叫:" + name); }}


3.创建绿苹果
public class GreenApple implements Apple { @Override public void get(String name) {  System.out.println("获取绿苹果,我的名字叫:" + name); }}


4.创建工厂类
/** * 苹果工厂 *  * @author ww * */public class AppleFactory { public static Apple newInstance(int type) {  if (type != 1 && type != 2)   throw new RuntimeException("没有这种类型的苹果!");  if (type == 1)   return new RedApple();  else   return new GreenApple(); }}



5.创建客户端
public class Client { public static void main(String[] args) {  // 要改造的是new 相关的东西,因为new相关的是有问题的,客户端不应该知道如何实现  Apple apple = AppleFactory.newInstance(1);  apple.get("red apple");  apple = AppleFactory.newInstance(2);  apple.get("green apple");  // 报错;没有此种类型的苹果  apple = AppleFactory.newInstance(3); }}


5.简单工厂主要实现的功能

选择合适的实现类

既然要实现选择,那么就需要选择的条件或选择的参数,选择条件或参数的来源通过又有以下几种:

来源于客户端,Client传入参数

来源于配置文件,从配置文件获取用于判断的值;

来源于程序运行期的某个值,比如从缓存中获取某个运行期的值

简单工厂最主要的就是选择实现方式,创建对象其实是简单的,本文用的是客户端传入参数,其它同学可以试试用读取配置文件的方式实现!


















3 0