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

     ...

  • 相关阅读:
    微信开发返回验证来源方式代码
    Yii 开发过程 tips
    PHP 搜索分词实现代码
    PHP 中文字符串截取
    Ubuntu16.04设置静态ip
    Linux(Ubuntu18.04)安装Chrome浏览器
    ubuntu18.04安装redis
    ubuntu18.04虚拟机安装docker
    虚拟机安装ssh,关闭防火墙
    面试送命题,你为什么从上家公司离职?(面试题总结大全)
  • 原文地址:https://www.cnblogs.com/byghui/p/3066455.html
Copyright © 2011-2022 走看看