工厂方法模式
来源:互联网 发布:尼尔森网联数据分析 编辑:程序博客网 时间:2024/04/29 14:20
1.女娲造人例子
2.AbstractHumanFactory是一个抽象类, 定义了一个八卦炉具有的整体功能, HumanFactory为实现类, 完成具体的任务——创建人类; Human接口是人类的总称, 其三个实现类分别为三类人种;
3.人类总称
public interface Human { //每个人种的皮肤都有相应的颜色 public void getColor(); //人类会说话 public void talk();}
public class BlackHuman implements Human {public void getColor(){ System.out.println("黑色人种的皮肤颜色是黑色的! ");}public void talk() { System.out.println("黑人会说话, 一般人听不懂。 ");}}
5.黄色人种
public class YellowHuman implements Human {public void getColor(){ System.out.println("黄色人种的皮肤颜色是黄色的! ");}public void talk() { System.out.println("黄色人种会说话, 一般说的都是双字节。 ");}}
娲最可能给八卦炉下达什么样的生产命令呢? 应该是“给我生产出一个黄色人种
( YellowHuman类) ”, 而不会是“给我生产一个会走、 会跑、 会说话、 皮肤是黄色的人种”,
因为这样的命令增加了交流的成本, 作为一个生产的管理者, 只要知道生产什么就可以了,
而不需要事物的具体信息。 通过分析, 我们发现八卦炉生产人类的方法输入参数类型应该是
Human接口的实现类, 这也解释了为什么类图上的AbstractHumanFactory抽象类中createHuman
方法的参数为Class类型
7.抽象人类创建工厂
public abstract class AbstractHumanFactory { public abstract <T extends Human> T createHuman(Class<T> c);}
注意, 我们在这里采用了泛型( Generic) , 通过定义泛型对createHuman的输入参数产
生两层限制:
● 必须是Class类型;
● 必须是Human的实现类。
其中的"T"表示的是, 只要实现了Human接口的类都可以作为参数, 泛型是JDK 1.5中的
一个非常重要的新特性, 它减少了对象间的转换, 约束其输入参数类型, 对Collection集合下
的实现类都可以定义泛型。
8.目前女娲只有一个八卦炉, 其实现生产人类的方法
人类创建工厂
public class HumanFactory extends AbstractHumanFactory { public <T extends Human> T createHuman(Class<T> c){ //定义一个生产的人种 Human human=null;try { //产生一个人种 human = (T)Class.forName(c.getName()).newInstance();} catch (Exception e) { System.out.println("人种生成错误! ");} return (T)human;}}
9.女娲类
public class NvWa {public static void main(String[] args) { //声明阴阳八卦炉AbstractHumanFactory YinYangLu = new HumanFactory(); //女娲第一次造人, 火候不足, 于是白人产生了 System.out.println("--造出的第一批人是白色人种--"); Human whiteHuman = YinYangLu.createHuman(WhiteHuman.class); whiteHuman.getColor(); whiteHuman.talk(); //女娲第二次造人, 火候过足, 于是黑人产生了 System.out.println("\n--造出的第二批人是黑色人种--"); Human blackHuman = YinYangLu.createHuman(BlackHuman.class); blackHuman.getColor(); blackHuman.talk(); //第三次造人, 火候刚刚好, 于是黄色人种产生了 System.out.println("\n--造出的第三批人是黄色人种--"); Human yellowHuman = YinYangLu.createHuman(YellowHuman.class); yellowHuman.getColor(); yellowHuman.talk();}}
2.工厂方法模式的定义
1.在工厂方法模式中, 抽象产品类Product负责定义产品的共性, 实现对事物最抽象的定义; Creator为抽象创建类, 也就是抽象工厂, 具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。
2.抽象产品类
<pre name="code" class="java">public abstract class Product { //产品类的公共方法public void method1(){ //业务逻辑处理} //抽象方法public abstract void method2();}
具体的产品类可以有多个, 都继承于抽象产品类
3.具体产品类
public class ConcreteProduct1 extends Product {public void method2() {//业务逻辑处理}}public class ConcreteProduct2 extends Product {public void method2() {//业务逻辑处理}}
4.抽象工厂类负责定义产品对象的产生
抽象工厂类
public abstract class Creator {/** 创建一个产品对象, 其输入参数类型可以自行设置* 通常为String、 Enum、 Class等, 当然也可以为空*/public abstract <T extends Product> T createProduct(Class<T> c);}
具体工厂类
public class ConcreteCreator extends Creator {public <T extends Product> T createProduct(Class<T> c){Product product=null;try {product = (Product)Class.forName(c.getName()).newInstance();} catch (Exception e) {//异常处理}return (T)product;}}
6.场景类
public class Client {public static void main(String[] args) {Creator creator = new ConcreteCreator();Product product = creator.createProduct(ConcreteProduct1.class);/** 继续业务处理*/}}
3.简单工厂模式
1.简单工厂模式中的工厂类
public class HumanFactory {public static <T extends Human> T createHuman(Class<T> c){ //定义一个生产出的人种 Human human=null;try { //产生一个人种 human = (Human)Class.forName(c.getName()).newInstance();} catch (Exception e) { System.out.println("人种生成错误! ");} return (T)human;}}
2.简单工厂模式中的场景类
public class NvWa {public static void main(String[] args) { //女娲第一次造人, 火候不足, 于是白色人种产生了 System.out.println("--造出的第一批人是白色人种--"); Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class); whiteHuman.getColor(); whiteHuman.talk(); //女娲第二次造人, 火候过足, 于是黑色人种产生了 System.out.println("\n--造出的第二批人是黑色人种--"); Human blackHuman = HumanFactory.createHuman(BlackHuman.class); blackHuman.getColor(); blackHuman.talk(); //第三次造人, 火候刚刚好, 于是黄色人种产生了 System.out.println("\n--造出的第三批人是黄色人种--"); Human yellowHuman = HumanFactory.createHuman(YellowHuman.class); yellowHuman.getColor(); yellowHuman.talk();}}
0 0
- 工厂模式 -- 工厂方法
- 工厂模式-工厂方法
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式---工厂方法模式
- 【模式】工厂方法模式
- 工厂方法,抽象工厂模式
- C#工厂模式-工厂方法
- 工厂模式 和工厂方法
- 工厂模式-C-工厂方法
- 工厂模式以及工厂方法
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂方法、抽象工厂模式
- 工厂模式(简单工厂、工厂方法)
- 简单工厂|工厂方法|抽象工厂模式
- 设计模式-工厂模式(简单工厂模式+工厂方法模式)
- 二分图的最大匹配算法
- Android开发之DialogFragment
- [数学 拉格朗日四平方和定理 Rho大整数分解] BZOJ 2904 平方和
- Markdown
- Linux iptables
- 工厂方法模式
- 郑轻校赛总结
- springmvc 后端返回到前端乱码
- Log4j和Slf4j的关系
- android微博sdk实现登录分享获取用户名头像
- 二进制小数
- AFHTTPSessionManager 上传文件
- protobuf的Required,Optional,Repeated限定修饰符
- python 编码类型