工厂模式和建造者模式都属于创建型模式,它对类的实例化进行了抽象,能够使软件模块做到与对象的创建和组织无关。
简单工厂模式
专门定义一个类来负责创建其他类的实例,通常根据自变量的不同而返回不同的类的实例。
工厂类
public class MoblieFactor{ public Mobile getMobile(String title) { if(title.equals("nokia")) { return new Nolia(); } else if(title.equals("motorola")) { return new Motorola(); }else { throw new Exception("no such moblie"); } } }
Nolia Motorola 都是Moblie接口的实现类。
主函数
public static void main(String[] args) { MoblieFactor mf = new MoblieFactor(); Mobile m; m = mf.getMobile("nokia"); }
优点 :外界可以直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责使用就可以,而不必管这些对象是如何生产出来的
缺点:简单工厂模式将全部创建逻辑都集中到一个工厂中,违背了高内聚的责任分配原则。并且当系统中具体的产品类不断增多时,可能会不断修改工厂类,违背了开闭原则。
工厂方法模式
相比较于简单工厂模式,这里通过抽象工厂来解决传递参数选择产品的过程,并且产品的生成过程同样被其对应的工厂所隐藏。通过以上措施,在一定程度上克服了简单工厂模式的缺点。
/** * 手机接口 * @author jiahua */ public interface Moblie{ // TODO } /** * 手机工厂接口 * @author jiahua */ public interface MobileFactor{ public Moblie productMobile(); }
实现类
public class Motorola implements Moblie { // TODO } public class Nokia implements Moblie { // TODO } public class MotorolaFactor implements MobileFactor { @Override public Moblie productMobile() { return new Motorola(); } } public class NokiaFactor implements MobileFactor { @Override public Moblie productMobile() { return new Nokia(); } }
主类:
public static void main(String[] args) { MobileFactor mf = new MotorolaFactor(); // 需要什么产品就创造什么工厂 Moblie m; m = mf.productMobile(); }
优点:能够自主创建需要的产品对象,将创建过程的细节封装在工厂内部。
增加新产品时无需修改其他具体的工厂和具体类。
缺点:在添加新产品时,需要编写新的具体产品类和对应的具体工厂。
抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体类。
public abstract class ComputerFactor{ CPU cpu; HardDisk hd; MainBoard mb; public void show() { // 利用传进来的组件做事 } }
CPU、 HardDisk、 MainBoard 都是产品的类接口。
抽象工厂的实现类
public class IBM extends ComputerFactor { public IBM() { cpu = new AMD(); hd = new Maxtor(); mb = new MSIK7N2G(); } }
主类
public static void main(String[] args) { IBM ibm = new IBM(); ibm.show(); }
赋值操作左边都是 父类的内部变量即抽象工厂中变量。赋值操作右边都是具体产品接口的实现类。
抽象工厂模式与工厂方法模式最大的区别在于:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则针对的是多个产品等级结构。
优点:抽象工厂模式同样具备隔离具体类生成。并且当一个产品族中的多个对象设计成一起工作时,他能够保证客户端始终只使用同一个产品族中的对象。
缺点:再添加新的产品对象时,难以扩展抽象工厂模式以便产生新种类产品。
建造者模式
他是将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。
实现类
director类
主类
笔者曾在《深入浅出设计模式》书中看到这个建造者模式的例子,他与简单工厂模式极为相似。简单工厂类中的工厂被替换成了Director,逻辑判断与生成同样在该类中创建。可能不同的就是建造者模式中的建造对象的建造过程必简单工厂模式中的产品创建过程更为复杂。
建造者模式将一个复杂对象的生成责任作了很好的分配。他把构造过程放到指挥者的方法中,把装配过程放到具体建造者类中。