zoukankan      html  css  js  c++  java
  • 初学设计模式【6】抽象工厂模式——AbstractFactory

     开始之前

      插播一个设计原则:依赖倒置原则

      依赖倒置原则:要依赖抽象,不要依赖具体类

    定义

      提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

     UML类图

      分析: 可以看到Client只与抽象的工厂类,及抽象的产品类有关联。利用这此抽象类或接口书写代码,我们的代码将从具体类解耦,这也就遵守了上面提到的一个设计原则:依赖倒置原则。

     实例

      一个买手机的例子,我们到PhoneStore买手机。然后商店根据我们选择的手机品牌,开始制作手机,手机中有两个主要部件:cpu,主板。下图是uml类图:

    关键代码: 

    1>Cpu,Mainboard

    public abstract class Cpu {
    	String name;
    
    	public Cpu(String name) {
    		this.name = name;
    	}
    
    	public String cpuInfo() {
    		return " " + name+" ";
    	}
    }
    
    
    public abstract class Mainboard {
    	String name;
    
    	public Mainboard(String name) {
    		this.name = name;
    	}
    
    	public String mainboardInfo() {
    		return " " + name+" ";
    	}
    }
    

    2>MotoCpu,NokiaCpu

    public class MotoCpu extends Cpu {
    
    	public MotoCpu(String name) {
    		super(name);
    	}
    
    }
    
    
    public class NokiaCpu extends Cpu {
    
    	public NokiaCpu(String name) {
    		super(name);
    	}
    
    }
    

    3>MotoMainboard,NokiaMainboard

    public class MotoMainboard extends Mainboard{
    
    	public MotoMainboard(String name) {
    		super(name);
    	}
    
    }
    
    
    public class NokiaMainboard extends Mainboard {
    
    	public NokiaMainboard(String name) {
    		super(name);
    	}
    
    }
    

    4>PhonePartsFacotry 

    public abstract class PhonePartsFacotry {
    	public abstract Cpu createCpu();
    
    	public abstract Mainboard createMainboard();
    }
    

    5>MotoPhonePartsFacotry ,NokiaPhonePartsFacotry 

    public class MotoPhonePartsFacotry extends PhonePartsFacotry {
    
    	@Override
    	public Cpu createCpu() {
    		return new MotoCpu("MotoCpu");
    	}
    
    	@Override
    	public Mainboard createMainboard() {
    		return new MotoMainboard("MotoMainboard");
    	}
    
    }
    
    
    public class NokiaPhonePartsFacotry extends PhonePartsFacotry {
    
    	@Override
    	public Cpu createCpu() {
    		return new NokiaCpu("NokiaCpu");
    	}
    
    	@Override
    	public Mainboard createMainboard() {
    		// TODO Auto-generated method stub
    		return new NokiaMainboard("NokiaMainboard");
    	}
    
    }
    

    6>PhoneStore

    public class PhoneStore {
    	PhonePartsFacotry facotry;
    
    	public PhoneStore(PhonePartsFacotry facotry) {
    		this.facotry = facotry;
    	}
    
    	public Phone buyPhone() {
    		if (facotry instanceof MotoPhonePartsFacotry) {
    			return new MotoPhone("MotoPhone", facotry);
    		} else {
    			return new NokiaPhone("NokiaPhone", facotry);
    		}
    	}
    }
    

    测试

    import org.junit.Test;
    
    public class Testtt {
    
    	@Test
    	public void test() {
    		PhoneStore store = new PhoneStore(new MotoPhonePartsFacotry());
    		Phone phone = store.buyPhone();
    		phone.phoneInfo();
    	}
    }
    

     输出:

      

     总结:

     前面两篇:初学设计模式【4】简单工厂模式——SimpleFactory

          初学设计模式【5】工厂方法模式——FactoryMethod

    到现在三种工厂模式都说完了,这里再对它们作一个简单的对比:

    1>共性:

      这几种工厂模式都是用来封装创建对象的代码,降低客户代码对具体产品类的依赖,提升系统扩展能力的。

    2>差异

      a.如果要增加新的产品类,简单工厂模式与抽象工厂模式都要修改工厂类代码,没有严格遵守“开闭原则”,而工厂方法模式没有这个问题,对扩展的支持更好。

      b.简单工厂模式弊端较多,只适合在比较简单的环境中使用;工厂方法模式严格遵守“开闭原则”,适合在经常增加新产品的、对扩展要求比较高的环境中使用;抽象工厂模式适合在需要生产一系列相互关联的产品时使用。

     ...

  • 相关阅读:
    Linux文件属性
    [Oracle] Listener的动态注册
    jQuery easyUI Pagination控件自定义div分页(不用datagrid)
    桂林电子科技大学出校流量控制器Android版1.0.0
    php使用check box
    Python windows ping
    Python selenium chrome 环境配置
    Linux wget auto login and backup database
    PyQt4 ShowHMDB show sqlite3 with QTableWidget summary
    PyQt4 py2exe 打包 HardwareManager
  • 原文地址:https://www.cnblogs.com/byghui/p/3066455.html
Copyright © 2011-2022 走看看