工厂模式
工厂模式是最常用的设计模式之一,这种类型的设计模式属于创建设计模式,它提供了一种创建对象的最佳方式。
优点:1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想要增加多一个产品,只要扩展一个工厂类就可以了。 3、隐蔽产品的具体实现,调用者只要关系产品的接口。
代码编写出来是为了给别人 (client) 调用的:
• 调用者 (client) 跟代码编写者 (provider),可能是同一个人,也可能是不同的人
• 提供给调用者的代码,有可能是源码可见的,也可能是源码不可见、不可修改的(比如 jar 包)
所以,为了简化代码的协作使用及管理维护,必须想尽办法简化代码逻辑,实现必要的分离。
一、工厂方法模式
为 Phone 工厂创建一个接口:
/** * 工厂类的基类(接口类) */ public interface phoneFactory { phone createPhone(); }
如果想增加一款产品,比如 iPhone 手机,只需要为 iPhone 手机增加一个工厂类就可以了:
/** * iPhone 手机工厂类 */ public class IphoneFactory implements phoneFactory { @Override public phone createPhone(){ return new iPhone(); } }
如果还想增加一个 vivo 手机,还是增加一个相对的工厂类就可以了:
/** * vivo 手机工厂类 */ public class VivoFactory implements phoneFactory { @Override public phone createPhone(){ return new Vivo(); } }
客户端调用:
// 苹果手机的工厂类 phoneFactory Factory1 = new IphoneFactory(); Factory1.createPhone(); // vido 手机的工厂类 phoneFactory Factory2 = new VivoFactory(); Factory2.createPhone();
二、简单工厂模式
步骤一:创建一个接口类:
/** * 所有手机基类(接口类) */ public interface phone { void play(); }
步骤二:创建实体类,实现接口的 play() 方法:
/** * 华为手机实体类 */ public class Huawei implements phone { @Override public void play() { System.out.println("玩华为手机"); } }
/** * 小米手机实体类 */ public class Mi implements phone { @Override public void play() { System.out.println("玩小米MIX2"); } }
步骤三:工厂类
/** * 简单工厂类 */ public class PhoneFactory { public phone createPhone1(String tag) { if (tag.equals("pg")) { return new iPhone(); } else if (tag.equals("hw")) { return new Huawei(); } return null; } }
三、抽象工厂模式
步骤一:创建一个工厂接口
/** * 工厂类的基类(接口类) */ public interface phoneFactory { phone createPhone(phone p); usb createUSB(); charger createCharger(); }
步骤二:实现工厂接口的方法,去调用封装好的手机类
/** * 华为手机工厂类(实现工厂接口的方法) */ public class HuaweiPhoneFactory implements phoneFactory { phone createPhone() { return new HuaweiPhone(); } usb createUSB() { return new HuaweiUSB(); } charger createCharger() { return new HuaweiCharger(); } }
步骤五:客户端的调用
public static void main(String[] args) { // 这是一个华为手机的工厂类,实现了小米手机的方法 phoneFactory factory = new HuaweiFactory(); pf.createPhone(); pf.createUsb(); pf.createCharger(); }