回顾: 面向对象设计的基本原则java
1.OCP(开闭原则): 一个应用的实体对扩展开放,对修改关闭.(白话: 如今我有两个类构建一个功能,若是想要扩展新功能的话,根据原则是不要在原有的两个类上作修改,从新新建一个类来完成新加的功能)编程
2.DIP(依赖反转原则): 要针对接口编程,不要针对实现编程(白话: A实现类调用B实现类,具体关系,根据原则B类应当实现接口C类,而后A类与C类发生关系,将具体关系转为抽象依赖)数据结构
3.LoD(迪米特法则): 只与朋友通讯.(白话: 该法则的初衷在于下降对象之间的耦合,减小类和类的直接关系,功能的复用,模块独立化...更多信息[百度,gooale]查阅)ide
附加: 耦合类型,由高到低 ↓↓↓测试
实现建立和调用的分离, 将选择实现类、建立对象统一管理和控制.spa
三种工厂模式:设计
建立同一结构类型的任何对象,对于新增的对象,须要修改已有代码code
建立一个接口Dog对象
public interface Dog { void ability(); }
建立三种Dog,直接上真名了接口
public class 中华田园犬 implements Dog { @Override public void ability() { System.out.println("中华田园犬: 什么都能吃,听话,好养,能力强"); } } public class 哈士奇 implements Dog { @Override public void ability() { System.out.println("哈士奇: 吃荤吃素还不知道,这种狗的能力你们都知道"); } } public class 哈巴狗 implements Dog { @Override public void ability() { System.out.println("哈巴狗: 大眼憨厚,听话好使"); } }
建立工厂类
public class FactoryZone { //第一种方式 public static Dog factoryForDog(String type){ Dog dog=null; if (type.equals("中华田园犬")){ dog=new 中华田园犬(); }else if (type.equals("哈士奇")){ dog=new 哈士奇(); }else if (type.equals("哈巴狗")){ dog=new 哈巴狗(); } //新增的话,须要在此处追加. return dog; } //第二种方式 public Dog get中华田园犬(){ return new 中华田园犬(); } public Dog get哈士奇(){ return new 哈士奇(); } public Dog get哈巴狗(){ return new 哈巴狗(); } }
测试 FactoryMain
public class FactoryMain { public static void main(String[] args) { //无工厂模式,这种状况下FactoryMain依赖Dog接口以及中华田园犬类,哈士奇类,哈巴狗类 Dog dog=new 中华田园犬(); dog.ability(); Dog dog1=new 哈士奇(); dog1.ability(); Dog dog2=new 哈巴狗(); dog2.ability(); //简单工厂模式,这种状况下FactoryMain依赖FactoryZone以及Dog接口 //内部FactoryZone依赖Dog接口以及中华田园犬类,哈士奇类,哈巴狗类 //总体关系复杂,调用者简单 FactoryZone.factoryForDog("中华田园犬").ability(); FactoryZone.factoryForDog("哈士奇").ability(); FactoryZone.factoryForDog("哈巴狗").ability(); } }
建立同一结构类型的固定对象,能够新增任何对象
建立 DogFactory接口
public interface DogFactory { Dog getDog(); }
建立不一样的生产工厂
public class 中华田园犬Factory implements DogFactory { @Override public Dog getDog() { return new 中华田园犬(); } } public class 哈士奇Factory implements DogFactory { @Override public Dog getDog() { return new 哈士奇(); } } public class 哈巴狗Factory implements DogFactory { @Override public Dog getDog() { return new 哈巴狗(); } } 若是新增了其余的Dog的时候,须要新增另外的类xxFactory implements DogFactory 该设计符合开闭原则,若是不少Dog的话,就也要加不少的xxFactory类
public class FactoryMain { public static void main(String[] args) { //工厂方式模式,FactoryMain依赖DogFactory以及中华田园犬Factory(),哈士奇Factory(),哈巴狗Factory() //DogFactory依赖Dog接口以及中华田园犬类,哈士奇类,哈巴狗类 DogFactory dogFactory = new 中华田园犬Factory(); dogFactory.getDog().ability(); DogFactory dogFactory1 = new 哈士奇Factory(); dogFactory1.getDog().ability(); DogFactory dogFactory2 = new 哈巴狗Factory(); dogFactory2.getDog().ability(); } }
理论和实际老是相差些什么,正常状况下,仍是使用简单工厂会多点.
建立不一样产品族的任何对象,不能够新增新单个对象,能够新增不一样产品族,用到这种模式说明项目体系比较大了,引用某大大的一张图作记录,该模式是工厂的工厂,根据下图创建理解思惟,代码省略:
-----------------------------------------------------------