工厂方法模式
来源:互联网 发布:win7安装linux 编辑:程序博客网 时间:2024/06/03 18:42
工厂方法模式定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
UML类图:
所有工厂模式都用来封装对象的创建。工厂方法模式通过让子类决定改创建的对象是什么,来达到将对象创建的过程封装的目的。
1. Creator所有子类都必须实现这个抽象的factoryMethod()方法。
2. ConcreteCreator实现了factoryMethod(),以实际制造出产品。由它负责创建一个或多个集体产品,只有此类知道如何创建这些产品。
3. 所有产品ConcreteProduct必须实现Product,这样就可以使用这个接口,而不是具体的类。
注意:这里说的实现不一定是实现接口,而是泛指超类。
所有工厂模式都用来封装对象的创建。工厂方法模式通过让子类决定改创建的对象是什么,来达到将对象创建的过程封装的目的。这样做的好处是在实例化对象时,只会依赖于接口,而不是具体的类。(设计原则:针对接口编程)
例如:有一个蛋糕工厂,由蛋糕工厂负责生产各种蛋糕(奶油蛋糕、巧克力蛋糕、水果蛋糕、冰欺凌蛋糕等等)
//蛋糕类
public abstract class Cake {protected String name;//名字public void make() {System.out.println("做蛋糕---");}public String makeDone() {return name;}}
//巧克力蛋糕
public class ChocolateCake extends Cake {public ChocolateCake() {name = "巧克力蛋糕";}}
//奶油蛋糕
public class MilkCake extends Cake{public MilkCake() {name = "奶油蛋糕";}}
//工厂
public abstract class Factory {//1.工厂方法是抽象的。//2.工厂方法必须返回一个产品。//3.工厂方法将客户(超类中的代码,例如:toMake())和具体创建产品的代码分隔开来。abstract Cake createCake(String item);public Cake toMake(String type){Cake cake = createCake(type);return cake;}}
//蛋糕工厂
public class CakeFactory extends Factory{@OverrideCake createCake(String item) {if(item.equals("chocolate")){return new ChocolateCake();}else if (item.equals("milk")){return new MilkCake();}else {return null;}}}
//客户端
public class ClientTest {public static void main(String[] args) {String cakeName = "chocolate";//首先先创建一个蛋糕工厂Factory factory = new CakeFactory();//由蛋糕店工厂负责生产客户所需要的蛋糕,根据cakeName改变所需要的蛋糕。Cake cake = factory.toMake(cakeName);//取出工厂创建的蛋糕System.out.print(cake.makeDone());}}
输出:巧克力蛋糕
- 工厂模式 -- 工厂方法
- 工厂模式-工厂方法
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式-工厂方法模式
- 工厂模式---工厂方法模式
- 【模式】工厂方法模式
- 工厂方法,抽象工厂模式
- C#工厂模式-工厂方法
- 工厂模式 和工厂方法
- 工厂模式-C-工厂方法
- 工厂模式以及工厂方法
- 简单工厂、工厂方法、抽象工厂模式
- 简单工厂、工厂方法、抽象工厂模式
- 工厂模式(简单工厂、工厂方法)
- 简单工厂|工厂方法|抽象工厂模式
- 设计模式-工厂模式(简单工厂模式+工厂方法模式)
- 修改Ubuntu下的jenkins端口号
- C51与单片机系统多级菜单的模块化设计
- cygwin 生成.so
- 二分法、快速排序
- CSS3 圆角(border-radius)
- 工厂方法模式
- 易错点:C++ switch case中定义变量
- 优化技巧分享:把内存消耗降低至原来的1/20
- Daily-C-Study(20):C语言#pragma预处理
- hdu 4325
- Tiny210 android 2.3 在Ubuntu下编译问题
- 生成函数调用图(转贴+补充)
- 二叉排序树查找
- java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I