工厂方法模式,抽象工厂模式,简单实例分析

为了更好地理解这两个模式,自己假设了如下场景,可能有些牵强,但应该还好。嘿嘿。
 
Acer,Lenovo两家本本制造商,假设原来有一OEM两个牌子的本本都做,这时,无论你想买那种牌子的,都可以直接向OEM购买。
可是后来该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理,而且,如果以后要加入新的品牌的话,要有许多设备上的改动,等等原因,于是,它决定衍生出些子厂,每个子厂只做一种牌子的本本,而OEM核心总部,只负责制定规范,即,每个子厂要完成的所有任务。
 
该OEM的初始状态,就是静态工厂方法的场景,自己负责一切生产任务,根据外界的需求,去制造本本。
后来,为了便于管理,和把引入新品牌后产生的变动降到最低,采取了工厂方法模式。即,核心的工厂不再负责创建等具体动作,把这些派发给自己的子工厂。而核心工厂,仅负责制定规范。
 
1.工厂方法模式
 
首先,定义产品接口,Laptop,当然,也可以是个抽象类。

点击(此处)折叠或打开

  1. package factoryMethod;

  2. abstract public class Laptop {
  3.     
  4.     private String mark;

  5.     public Laptop(String str){
  6.         
  7.         this.mark = str;
  8.         
  9.     }
  10.     
  11.     abstract public String getId();
  12.     
  13.     public void echoMark(){
  14.         
  15.         System.out.println("this is a "+mark+" Laptop");
  16.         
  17.     }

  18. }

有了产品接口,我们就可以去定义那个核心工厂接口

点击(此处)折叠或打开

  1. package factoryMethod;

  2. public interface LaptopFactory {
  3.     
  4.     public Laptop produce();
  5.     
  6.     public void service();

  7. }
如代码所示,核心工厂规定了它子类要完成的行为,即,制造本本,和售后服务。
下面,是具体产品类,比如Acer品牌的本本


点击(此处)折叠或打开

  1. package factoryMethod;

  2. public class AcerLaptop extends Laptop {

  3.     
  4.     private static final String mark = "Acer";
  5.     protected static int initId;
  6.     
  7.     public AcerLaptop() {
  8.         super(AcerLaptop.mark);
  9.         AcerLaptop.initId = 10001;
  10.     }

  11.     public String getId() {

  12.         return "Acer--"+(AcerLaptop.initId++);

  13.     }

  14. }
再来个Lenovo的本本

点击(此处)折叠或打开

  1. package factoryMethod;

  2. public class LenovoLaptop extends Laptop {

  3.     private static final String mark = "Lenovo";
  4.     protected static int initId;
  5.     
  6.     public LenovoLaptop() {

  7.         super(LenovoLaptop.mark);
  8.         LenovoLaptop.initId = 20001;
  9.     }

  10.     public String getId() {

  11.         return "Lenovo--"+(LenovoLaptop.initId++);

  12.     }

  13. }

其实Laptop定义的抽象方法没什么具体意义,该例子只为描述工厂方法模式。
 
下面,来定义具体工厂,Acer的,和Lenovo的,里面的方法同样没什么太大意义,只为测试。
 
 

点击(此处)折叠或打开

  1. package factoryMethod;

  2. public class AcerFactory implements LaptopFactory {

  3.     @Override
  4.     public Laptop produce() {
  5.         
  6.         return new AcerLaptop();//生产Acer的本本
  7.         
  8.     }

  9.     @Override
  10.     public void service() {
  11.         
  12.         System.out.println("welcom to Acer hotline ");

  13.     }

  14. }


点击(此处)折叠或打开

  1. public class LenovoFactory implements LaptopFactory{
  2.     
  3.     public Laptop produce(){
  4.         
  5.         return new LenovoLaptop();//生产lenovo的本本
  6.         
  7.     }
  8.     
  9.     public void service(){
  10.         
  11.         System.out.println("welcom to Lenovo hotline ");
  12.         
  13.     }

  14. }

来一个测试类。

点击(此处)折叠或打开

  1. package factoryMethod;

  2. public class Client {

  3.         public static void main(String[] args) {
  4.             
  5.             LenovoFactory lf = new LenovoFactory();
  6.             AcerFactory af= new AcerFactory();
  7.             Laptop lt1 = lf.produce();
  8.             Laptop lt2 = lf.produce();
  9.             Laptop lt3 = af.produce();
  10.             Laptop lt4 = af.produce();
  11.             
  12.             
  13.             lf.service();
  14.             System.out.println(lt1.getId());
  15.             System.out.println(lt2.getId());
  16.             System.out.println("--------------");
  17.             af.service();
  18.             System.out.println(lt3.getId());
  19.             System.out.println(lt4.getId());

  20.         }
  21. }

打印结果如下

点击(此处)折叠或打开

  1. welcom to Lenovo hotline 
  2. Lenovo--20001
  3. Lenovo--20002
  4. --------------
  5. welcom to Acer hotline 
  6. Acer--10001
  7. Acer--10002

过了一段时间,该OEM决定除了做本本,也做手机。而且OEM核心工厂决定改变下现有策略,每个子工厂做同一品牌的两个产品,例如,子工厂A做Acer的手机和本本。
这时,有了同族产品的概念,即某些产品是一个产品族的,这里就是指同一个品牌的。
 
为了完成这一变更,就要是用抽象工厂方法了。这个要比前一个复杂一些,所以先画了一个uml图。
 
 
 
-工厂接口,AbstractFatory,指定了子类要实现的制造本本,制造手机的方法
-具体工厂类,AcerFactory,LenovoFactory,均实现了上述方法,每个具体工厂负责一个产品族。
-MobilePhone抽象类,指定Phone产品的一些属性特征,Laptop同理。
-Phone与Laptop属于不同等级的产品,但是同一品牌的Phone和Laptop是同一产品族的产品,在此例中。
 
这里就不再罗列代码了,uml图可以比较清晰的说明每个角色间的关系。
总结起来,引用百度百科的一句话,抽象工厂模式使用同一个 工厂等级结构负责不同产品等级结构产品对象的创建。
 
----------------------------------------------------------------------------
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值