工厂模式
实质:创建对象不应用new而应用工厂办法代替。
简略工厂模式
工厂所治理的类的对立接口:Product
public interface Product { void work(); }
具体实现类:Phone和Computer
public class Computer implements Product { @Override public void work() { System.out.println("computer work..."); } }
public class Phone implements Product { @Override public void work() { System.out.println("phone work..."); } }
工厂类创立依据传入的名称创立对应产品:
public class SimpleFactory { public static Product getProduct(String name){ switch (name){ case "phone": return new Phone(); case "computer": return new Computer(); default: return null; } } public static void main(String[] args) { Product phone = SimpleFactory.getProduct("phone"); if (phone!=null){ phone.work(); } } }
长处:编写简略
毛病:每次新增一个产品类型都要改变getProduct()代码。
工厂办法模式
产品和简略工厂一样继承Product
新增接口 ProductFactory 用于生成产品
public interface ProductFactory { Product getProduct(); }
新增理论产品的工厂
/** * @author objcfeng * @description 电脑工厂 * @date 2020/10/20 */ public class ComputerFactory implements ProductFactory { @Override public Product getProduct() { return new Computer(); } }
public class PhoneFactory implements ProductFactory { @Override public Product getProduct() { return new Phone(); } }
测试类:
public class Main { public static void main(String[] args) { new PhoneFactory().getProduct().work(); } }
相较于简略工厂模式来说,解决了对批改敞开的不反对的问题,然而代码更简单。
形象工厂模式
产品不须要对立的接口,因为若都实现对立的接口,在产品工厂生产产品时,不好做辨别,须要传入参数做判断。
产品:
手机接口
public interface IPhoneProduct { void work(); }
路由器接口
public interface IRouterProduct { void work(); }
产品的实现类:
public class HuiWeiPhone implements IPhoneProduct { @Override public void work() { System.out.println("华为手机"); } }
...
产品工厂:
public interface ProductFactory { IRouterProduct getRouter(); IPhoneProduct getPhone(); }
华为工厂:
public class HuaWeiFactory implements ProductFactory { @Override public IRouterProduct getRouter() { return new HuaWeiRouter(); } @Override public IPhoneProduct getPhone() { return new HuiWeiPhone(); } }
小米工厂:
public class XiaoMiFactory implements ProductFactory { @Override public IRouterProduct getRouter() { return new XiaoMiRouter(); } @Override public IPhoneProduct getPhone() { return new XiaoMiPhone(); } }
测试:
public class Main { public static void main(String[] args) { new XiaoMiFactory().getPhone().work(); } }
形象工厂办法把一个品牌的产品很好的拆散开来,增加产品族(一个品牌的所有产品)很不便。