工厂方法模式:
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。所有工厂模式都用来封装对象的创建。工厂方法模式通过让子类决定创建的对象是什么,来达到将对象创建的过程封装的目的。工厂方法是抽象的,所以依赖子类来处理对象的创建。
简单工厂:
把全部的事情,在一个地方都处理完了,然而工厂方法却是创建要给框架,让子类决定要如何实现。简单工厂不具备工厂方法的弹性,因为简单工厂不能变更正在创建的产品。
抽象工厂模式:
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么。
- 所有的工厂都是用来封装对象的创建
- 简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。
- 工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
- 抽象工厂使用对象组合:对象的创建被工厂即可所暴露出来的方法中。
- 所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合。
- 工厂方法允许类实例化延迟到子类进行。
- 抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。
- 依赖倒置原则,指导我们避免依赖具体类型,而要尽量依赖抽象。
- 工厂是很有威力的技巧,帮助我们针对抽象编程,而不要针对具体类编程。
Demo:
public interface Milk { String getName(); }
public class Mengniu implements Milk{ public String getName() { return "蒙牛"; } }
public class Telunsu implements Milk{ public String getName() { return "特仑苏"; } }
public class Yili implements Milk{ public String getName() { return "伊利"; } }
public class SimpleFactory { public Milk getMile(String type){ if ("特仑苏".equals(type)){ return new Telunsu(); }else if ("伊利".equals(type)){ return new Yili(); }else if ("蒙牛".equals(type)){ return new Mengniu(); } return null; } }
public class SimpleFactoryTest { public static void main(String[] args) { SimpleFactory simpleFactory = new SimpleFactory(); System.out.println(simpleFactory.getMile("特仑苏").getName()); } }
public interface Factory { Milk getMilk(); }
public class FactoryTest { public static void main(String[] args) { Factory factory = new MengniuFactory(); System.out.println(factory.getMilk().getName()); } }
public class MengniuFactory implements Factory{ public Milk getMilk() { return new Mengniu(); } }
public class TelunsuFactory implements Factory{ public Milk getMilk() { return new Telunsu(); } }
public class YiliFactory implements Factory{ public Milk getMilk() { return new Yili(); } }
public class MilkFactory extends AbstraFactory{ public Milk getMengniu() { return new MengniuFactory().getMilk(); } public Milk getYili() { return new YiliFactory().getMilk(); } public Milk getTelunsu() { return new TelunsuFactory().getMilk(); } }
public class AbstraFactoryTest { public static void main(String[] args) { MilkFactory milkFactory = new MilkFactory(); System.out.println(milkFactory.getMengniu().getName()); } }
public abstract class AbstraFactory { /** * 获得蒙牛品牌牛奶 * @return */ public abstract Milk getMengniu(); /** * 获得伊利品牌牛奶 * @return */ public abstract Milk getYili(); /** * 获得特仑苏品牌牛奶 * @return */ public abstract Milk getTelunsu(); }