工厂方法模式,抽象工厂模式,简单实例分析
2015-10-20 23:29
363 查看
为了更好地理解这两个模式,自己假设了如下场景,可能有些牵强,但应该还好。嘿嘿。
Acer,Lenovo两家本本制造商,假设原来有一OEM两个牌子的本本都做,这时,无论你想买那种牌子的,都可以直接向OEM购买。
可是后来该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理,而且,如果以后要加入新的品牌的话,要有许多设备上的改动,等等原因,于是,它决定衍生出些子厂,每个子厂只做一种牌子的本本,而OEM核心总部,只负责制定规范,即,每个子厂要完成的所有任务。
该OEM的初始状态,就是静态工厂方法的场景,自己负责一切生产任务,根据外界的需求,去制造本本。
后来,为了便于管理,和把引入新品牌后产生的变动降到最低,采取了工厂方法模式。即,核心的工厂不再负责创建等具体动作,把这些派发给自己的子工厂。而核心工厂,仅负责制定规范。
1.工厂方法模式
首先,定义产品接口,Laptop,当然,也可以是个抽象类。
点击(此处)折叠或打开
package factoryMethod;
abstract public class Laptop {
private String mark;
public Laptop(String str){
this.mark = str;
}
abstract public String getId();
public void echoMark(){
System.out.println("this
is a "+mark+"
Laptop");
}
}
有了产品接口,我们就可以去定义那个核心工厂接口
点击(此处)折叠或打开
package factoryMethod;
public interface LaptopFactory {
public Laptop produce();
public void service();
}
如代码所示,核心工厂规定了它子类要完成的行为,即,制造本本,和售后服务。
下面,是具体产品类,比如Acer品牌的本本
点击(此处)折叠或打开
package factoryMethod;
public class AcerLaptop extends Laptop {
private static final String mark = "Acer";
protected static int initId;
public AcerLaptop() {
super(AcerLaptop.mark);
AcerLaptop.initId = 10001;
}
public String getId() {
return "Acer--"+(AcerLaptop.initId++);
}
}
再来个Lenovo的本本
点击(此处)折叠或打开
package factoryMethod;
public class LenovoLaptop extends Laptop {
private static final String mark = "Lenovo";
protected static int initId;
public LenovoLaptop() {
super(LenovoLaptop.mark);
LenovoLaptop.initId = 20001;
}
public String getId() {
return "Lenovo--"+(LenovoLaptop.initId++);
}
}
其实Laptop定义的抽象方法没什么具体意义,该例子只为描述工厂方法模式。
下面,来定义具体工厂,Acer的,和Lenovo的,里面的方法同样没什么太大意义,只为测试。
点击(此处)折叠或打开
package factoryMethod;
public class AcerFactory implements LaptopFactory {
@Override
public Laptop produce() {
return new AcerLaptop();//生产Acer的本本
}
@Override
public void service() {
System.out.println("welcom
to Acer hotline ");
}
}
点击(此处)折叠或打开
public class LenovoFactory implements LaptopFactory{
public Laptop produce(){
return new LenovoLaptop();//生产lenovo的本本
}
public void service(){
System.out.println("welcom
to Lenovo hotline ");
}
}
来一个测试类。
点击(此处)折叠或打开
package factoryMethod;
public class Client {
public static void main(String[] args) {
LenovoFactory lf = new LenovoFactory();
AcerFactory af= new AcerFactory();
Laptop lt1 = lf.produce();
Laptop lt2 = lf.produce();
Laptop lt3 = af.produce();
Laptop lt4 = af.produce();
lf.service();
System.out.println(lt1.getId());
System.out.println(lt2.getId());
System.out.println("--------------");
af.service();
System.out.println(lt3.getId());
System.out.println(lt4.getId());
}
}
打印结果如下
点击(此处)折叠或打开
welcom to Lenovo hotline
Lenovo--20001
Lenovo--20002
--------------
welcom to Acer hotline
Acer--10001
Acer--10002
过了一段时间,该OEM决定除了做本本,也做手机。而且OEM核心工厂决定改变下现有策略,每个子工厂做同一品牌的两个产品,例如,子工厂A做Acer的手机和本本。
这时,有了同族产品的概念,即某些产品是一个产品族的,这里就是指同一个品牌的。
为了完成这一变更,就要是用抽象工厂方法了。这个要比前一个复杂一些,所以先画了一个uml图。
-工厂接口,AbstractFatory,指定了子类要实现的制造本本,制造手机的方法
-具体工厂类,AcerFactory,LenovoFactory,均实现了上述方法,每个具体工厂负责一个产品族。
-MobilePhone抽象类,指定Phone产品的一些属性特征,Laptop同理。
-Phone与Laptop属于不同等级的产品,但是同一品牌的Phone和Laptop是同一产品族的产品,在此例中。
这里就不再罗列代码了,uml图可以比较清晰的说明每个角色间的关系。
总结起来,引用百度百科的一句话,抽象工厂模式使用同一个 工厂等级结构负责不同产品等级结构产品对象的创建。
----------------------------------------------------------------------------
Acer,Lenovo两家本本制造商,假设原来有一OEM两个牌子的本本都做,这时,无论你想买那种牌子的,都可以直接向OEM购买。
可是后来该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理,而且,如果以后要加入新的品牌的话,要有许多设备上的改动,等等原因,于是,它决定衍生出些子厂,每个子厂只做一种牌子的本本,而OEM核心总部,只负责制定规范,即,每个子厂要完成的所有任务。
该OEM的初始状态,就是静态工厂方法的场景,自己负责一切生产任务,根据外界的需求,去制造本本。
后来,为了便于管理,和把引入新品牌后产生的变动降到最低,采取了工厂方法模式。即,核心的工厂不再负责创建等具体动作,把这些派发给自己的子工厂。而核心工厂,仅负责制定规范。
1.工厂方法模式
首先,定义产品接口,Laptop,当然,也可以是个抽象类。
点击(此处)折叠或打开
package factoryMethod;
abstract public class Laptop {
private String mark;
public Laptop(String str){
this.mark = str;
}
abstract public String getId();
public void echoMark(){
System.out.println("this
is a "+mark+"
Laptop");
}
}
有了产品接口,我们就可以去定义那个核心工厂接口
点击(此处)折叠或打开
package factoryMethod;
public interface LaptopFactory {
public Laptop produce();
public void service();
}
如代码所示,核心工厂规定了它子类要完成的行为,即,制造本本,和售后服务。
下面,是具体产品类,比如Acer品牌的本本
点击(此处)折叠或打开
package factoryMethod;
public class AcerLaptop extends Laptop {
private static final String mark = "Acer";
protected static int initId;
public AcerLaptop() {
super(AcerLaptop.mark);
AcerLaptop.initId = 10001;
}
public String getId() {
return "Acer--"+(AcerLaptop.initId++);
}
}
再来个Lenovo的本本
点击(此处)折叠或打开
package factoryMethod;
public class LenovoLaptop extends Laptop {
private static final String mark = "Lenovo";
protected static int initId;
public LenovoLaptop() {
super(LenovoLaptop.mark);
LenovoLaptop.initId = 20001;
}
public String getId() {
return "Lenovo--"+(LenovoLaptop.initId++);
}
}
其实Laptop定义的抽象方法没什么具体意义,该例子只为描述工厂方法模式。
下面,来定义具体工厂,Acer的,和Lenovo的,里面的方法同样没什么太大意义,只为测试。
点击(此处)折叠或打开
package factoryMethod;
public class AcerFactory implements LaptopFactory {
@Override
public Laptop produce() {
return new AcerLaptop();//生产Acer的本本
}
@Override
public void service() {
System.out.println("welcom
to Acer hotline ");
}
}
点击(此处)折叠或打开
public class LenovoFactory implements LaptopFactory{
public Laptop produce(){
return new LenovoLaptop();//生产lenovo的本本
}
public void service(){
System.out.println("welcom
to Lenovo hotline ");
}
}
来一个测试类。
点击(此处)折叠或打开
package factoryMethod;
public class Client {
public static void main(String[] args) {
LenovoFactory lf = new LenovoFactory();
AcerFactory af= new AcerFactory();
Laptop lt1 = lf.produce();
Laptop lt2 = lf.produce();
Laptop lt3 = af.produce();
Laptop lt4 = af.produce();
lf.service();
System.out.println(lt1.getId());
System.out.println(lt2.getId());
System.out.println("--------------");
af.service();
System.out.println(lt3.getId());
System.out.println(lt4.getId());
}
}
打印结果如下
点击(此处)折叠或打开
welcom to Lenovo hotline
Lenovo--20001
Lenovo--20002
--------------
welcom to Acer hotline
Acer--10001
Acer--10002
过了一段时间,该OEM决定除了做本本,也做手机。而且OEM核心工厂决定改变下现有策略,每个子工厂做同一品牌的两个产品,例如,子工厂A做Acer的手机和本本。
这时,有了同族产品的概念,即某些产品是一个产品族的,这里就是指同一个品牌的。
为了完成这一变更,就要是用抽象工厂方法了。这个要比前一个复杂一些,所以先画了一个uml图。
-工厂接口,AbstractFatory,指定了子类要实现的制造本本,制造手机的方法
-具体工厂类,AcerFactory,LenovoFactory,均实现了上述方法,每个具体工厂负责一个产品族。
-MobilePhone抽象类,指定Phone产品的一些属性特征,Laptop同理。
-Phone与Laptop属于不同等级的产品,但是同一品牌的Phone和Laptop是同一产品族的产品,在此例中。
这里就不再罗列代码了,uml图可以比较清晰的说明每个角色间的关系。
总结起来,引用百度百科的一句话,抽象工厂模式使用同一个 工厂等级结构负责不同产品等级结构产品对象的创建。
----------------------------------------------------------------------------
相关文章推荐
- [Django模板系统]在模板中加载css/js等静态文件
- poj 2105 IP Address
- 常用LINUX命令
- First Bad Version
- nyoj 37 回文字符串
- iOS文件相关操作(NSFileManager)
- Java中的数据事务操作概述
- 利用函数调用,对数组进行初始化,更改,清零,逆置等操作
- Qt udp socket用于进程间通信
- python 文件系统
- 2014牡丹江区域赛题解
- 写在跳槽前——各种android面试题
- 在屏幕上打印杨辉三角
- poj2135 最小费用流
- POJ 2367 Genealogical tree
- C语言字符格式化输出总结
- 记ccpc南阳——首届中国大学生程序设计竞赛
- HDU 4560 我是歌手 网络流+二分
- JavaScript高级程序设计之DOM之节点层次之Node类型第10.1.1讲
- 【线性代数公开课MIT Linear Algebra】 第八课 Ax=b,我们的核心问题