工厂模式
实质:创建对象不应用 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();
}
}
形象工厂办法把一个品牌的产品很好的拆散开来,增加产品族(一个品牌的所有产品)很不便。