设计模式-简单工厂
Posted bateman6988
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-简单工厂相关的知识,希望对你有一定的参考价值。
简单工厂模式又叫静态工厂方法模式,是有一个工厂对像决定创建出哪一种产品类的实例。
简单工厂模式的简略类图如下:
其示意性代码如下:
1 public interface Product{}
1 public class ConcreteProduct implements Product{ 2 3 public ConcreteProduct(){} 4 5 }
1 public class Creator { 2 public static Product factor(){ 3 return new ConcreateProduct (); 4 } 5 }
从上面的类图可以看出,简单工厂模式涉及到三个角色,工厂类角色,抽像产品角色和具体产品角色
A.工厂类角色:是该模式的核心,他与商业逻辑紧密相关,跟据商业逻辑产生具体的产品,一般情况下,有一个具体的JAVA类来实现
B.抽像产品角色:是一个接口或者抽像类,具体产品类实现或者继承自该抽像产品角色。
C.具体产品角色:有一个具体JAVA类来实现,静态工厂方法所创建的任何对像都是这个角色的实例。
如现在有一个自动售货机,售货机可以销售物品,比如红茶和绿茶等,如下图所示
每个物品都有名字和价格等信息。
1.Goods :物品的抽像角色,每个物品都有名称和价格。
2. GreenTea BlackTea: 绿茶和红茶,具体的物品,具体产品角色
3. AutoMachine: 自动售货机,售卖物品的工厂。
样例代码如:
package com.designpattern.simplefactory; public interface Goods { public String getName(); public Double getPrice(); } public class GreenTea implements Goods { @Override public String getName() { // TODO Auto-generated method stub return "GreenTea"; } @Override public Double getPrice() { // TODO Auto-generated method stub return 5d; } } public class BlackTea implements Goods { @Override public String getName() { // TODO Auto-generated method stub return "BlackTea"; } @Override public Double getPrice() { // TODO Auto-generated method stub return 3d; } } public class AutoMachine { public static Goods factory(String name) { if (name.equalsIgnoreCase("greenTea")) { return new GreenTea(); } else if (name.equalsIgnoreCase("blackTea")) { return new BlackTea(); } else { return null; } } public static void main(String[] args) { Goods goods=AutoMachine.factory("greenTea"); System.out.println(goods.getName()); System.out.println(goods.getPrice()); } }
简单工厂模式还有如下几种变种的情况,如:
1.当系统中可以确定具体产品只可能有一个时,那么就可以省略掉抽像角色,工厂角色直接返回具体产品,如下图示:
2.工厂角色也可以和抽像角色合并,如下图:
JDK中的DateFormat类就是采用上了述方法
DateFormat是一个抽像类,但他有一些静态的工厂方法,如getDateInstance() 、getDateInstance(int arg0) ,这些静态工厂方法将会返回DateFormat的具体实现类的实例,如SimpleDateFormat的实例 。
3.三角色合并,如下图:
public class ConcreteProduct{ public ConcreteProduct(){} public static ConcreteProduct factory(){ retirm new ConcreteProduct(); } }
以上是关于设计模式-简单工厂的主要内容,如果未能解决你的问题,请参考以下文章