博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单工厂模式
阅读量:5025 次
发布时间:2019-06-12

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

简单工厂模式(Simple Factory Pattern)又叫静态工厂方法模式(Static FactoryMethod Pattern)

:由一个工厂类根据传入的参数动态决定应该创建哪一种产品(产品类)。

UML图:

 工厂角色(Factory)-->SimpleFactory:创建所需要的产品对象,被客户端调用。

 抽象(abstract Product)-->Ball 产品角色:所有具体产品的父类,父类可以是接口也可以是抽象类,产品的公共接口。

 具体产品(Concrete Product)----> FootBall & BaketBall角色:简单工厂所创建的具体产品对象。

 

实例:Ball简单工厂

抽象(abstract Product)产品角色:public abstract class Ball

package com.maggie.simplefactory;public  abstract  class Ball {     private String color;    public Ball(String color) {         super ();         this .color = color;    }    public Ball() {         super ();    }    public String getColor() {         return color;    }    public  void setColor(String color) {         this .color = color;    }        public  abstract  void play();    }

 

具体产品(Concrete Product)角色:从public abstract class Balll继承,重写方法,也可添加自己的方法。

FootBall

package com.maggie.simplefactory;public  class FootBall extends Ball {
@Override public void play() {
String player = "the ball's color is "+ this .getColor()+",I am FootBall" ; System.out.println(player); } public FootBall() { super (); // TODO Auto-generated constructor stub } public FootBall(String color) { super (color); // TODO Auto-generated constructor stub } }

 

BasketBall

package com.maggie.simplefactory;public  class BasketBall extends Ball {
@Override public void play() {
String player = "the ball's color is "+ this .getColor()+",I am BasketBall" ; System.out.println(player); } public BasketBall() { super (); // TODO Auto-generated constructor stub } public BasketBall(String color) { super (color); // TODO Auto-generated constructor stub }}

 

 

 工厂角色(SimpleFactory):球生产厂类,静态方法,接收main传入的图形名称,找到相应的具体产品的class,实例化。

这里使用反射实现

package com.maggie.simplefactory;import java.lang.reflect.InvocationTargetException;public  class SimpleFactory {     public  static Ball createBall(Class c) {
Ball ball = null ; /* * ball = (Ball)Class.forName(c.getName()).newInstance(); 无参数构造函数的实例 */ try { // 有参数构造函数的实例 if (c.getName().contains("FootBall" )) {
ball = (Ball) c.getConstructor(String. class ).newInstance("white+black" ); } else if (c.getName().contains("BasketBall" )){
ball = (Ball) c.getConstructor(String. class ).newInstance("orange" ); } } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ball; }}

客户端调用

package com.maggie.simplefactory;public  class Client {     public  static  void main(String[] args) {
Ball ball = SimpleFactory.createBall(FootBall. class ); ball.play(); Ball ball2 = SimpleFactory.createBall(BasketBall. class ); ball2.play(); }}

输出的结果:

the ball's color is white+black,I am FootBallthe ball's color is orange,I am BasketBall

 

简单工厂模式使得客户端的代码变得简洁,不用去关心具体是怎么实现的

但是工厂类里面包含了所有的逻辑,如果需要添加新的产品,则就需要改变工厂类的各种逻辑,这就是简单工厂不好的地方。

因此简单工厂模式违背了开放-封闭原则的缺点

 

转载于:https://www.cnblogs.com/maggiejyt/p/7561152.html

你可能感兴趣的文章
Silverlight动态调用WEBSERVICE,WCF方法
查看>>
LeetCode 895. Maximum Frequency Stack
查看>>
模仿segmentfault 评论
查看>>
一个简单的日志函数C++
查看>>
Java 8 中如何优雅的处理集合
查看>>
IOS程序的启动过程
查看>>
连接Linux下 XAMPP集成环境中部署的禅道的数据库MariaDB
查看>>
Java操作Excel和Word
查看>>
Oracle 体系结构之ORACLE物理结构
查看>>
ORA-12538: TNS: no such protocol adapter
查看>>
盒子模型
查看>>
局域网协议
查看>>
[HNOI2012]永无乡 线段树合并
查看>>
Spring整合hibernate:3、使用XML进行声明式的事务管理
查看>>
SqlServer之Convert 函数应用格式化日期(转)
查看>>
软件测试领域中的10个生存和发展技巧
查看>>
Camera前后摄像头同时预览
查看>>
HDU 1856
查看>>
课堂作业01--架构师的职责
查看>>
iOS计算富文本(NSMutableAttributedString)高度
查看>>