简单工厂模式:
用来生产同一等级结构中的任意产品(对于增加新的产品需要覆盖已有代码)
实例化对象不用new,用工厂方法代替。
将调用者跟实现类解耦。
(虽然不符合开闭设计原则,但实际使用的多)
package factory_simple;
public interface Car {
public abstract void getCar();
}
package factory_simple;
public class WuLing implements Car {
@Override
public void getCar() {
// TODO Auto-generated method stub
System.out.println("wuling");
}
}
package factory_simple;
public class Tesla implements Car {
@Override
public void getCar() {
// TODO Auto-generated method stub
System.out.println("tesila");
}
}
package factory_simple;
public class CarFactory {
public static Car getCar(String car) {
if(car.contentEquals("wuling")) {
return new WuLing();
}else if(car.contentEquals("tesila")) {
return new Tesla();
}else {
return null;
}
}
}
package factory_simple;
public class Consumer {
public static void main(String[] args) {
Car c1=new WuLing();//用new实例化对象
c1.getCar();
//实例化对象不用new,用工厂方法代替,将调用者跟实现类解耦
Car c2=CarFactory.getCar("tesila");
c2.getCar();
}
}
结果:
wuling
tesila
工厂方法模式
用来生产同一等级结构中的任意产品(支持增加任意产品)
满足设计原则,但是不方便
package factory_method;
public interface Car {
public abstract void getCar();
}
package factory_method;
public interface CarFactory {
public abstract Car getCarname();
}
package factory_method;
public class Tesla implements Car {
@Override
public void getCar() {
// TODO Auto-generated method stub
System.out.println("tesila");
}
}
package factory_method;
public class TeslaFactory implements CarFactory {
@Override
public Car getCarname() {
// TODO Auto-generated method stub
return new Tesla();
}
}
package factory_method;
public class WuLing implements Car {
@Override
public void getCar() {
// TODO Auto-generated method stub
System.out.println("wuling");
}
}
package factory_method;
public class WuLingFactory implements CarFactory {
@Override
public Car getCarname() {
return new WuLing();
}
}
package factory_method;
public class Consumer {
public static void main(String[] args) {
Car c=new WuLingFactory().getCarname();
c.getCar();
}
}
结果:
wuling
抽象工厂:
围绕一个超级工厂,创建其他工厂。该超级工厂又称为其他工厂的工厂。
(不可以增加产品,可以增加产品族)
提供了创建一系列相关或者相互依赖对象的接口,无需指定它们的具体类。
相关概念:
(1)产品族:如:小米工厂生产的,小米手机和小米路由器属于同一个产品族。
(2)产品等级:如:小米工厂生产的小米手机和华为工厂生产的华为手机,都是手机属于同一产品等级。
package abstract_factory;
public interface IphoneProduct {
void open();
void shutDown();
void message();
}
package abstract_factory;
public interface IRoundProduct {
void open();
void shutDown();
void openWIFI();
}
package abstract_factory;
public class XiaomiPhone implements IphoneProduct {
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("小米手机开机");
}
@Override
public void shutDown() {
// TODO Auto-generated method stub
System.out.println("小米手机关机");
}
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("小米手机发短信");
}
}
package abstract_factory;
public class XiaomiRound implements IRoundProduct {
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("小米路由器开机");
}
@Override
public void shutDown() {
// TODO Auto-generated method stub
System.out.println("小米路由器关机");
}
@Override
public void openWIFI() {
// TODO Auto-generated method stub
System.out.println("小米路由器开wifi");
}
}
package abstract_factory;
public class HuaweiPhone implements IphoneProduct {
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("华为手机开机");
}
@Override
public void shutDown() {
// TODO Auto-generated method stub
System.out.println("华为手机关机");
}
@Override
public void message() {
// TODO Auto-generated method stub
System.out.println("华为手机发短信");
}
}
package abstract_factory;
public class HuaweiRound implements IRoundProduct {
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("华为路由器开机");
}
@Override
public void shutDown() {
// TODO Auto-generated method stub
System.out.println("华为路由器关机");
}
@Override
public void openWIFI() {
// TODO Auto-generated method stub
System.out.println("华为路由器开wifi");
}
}
package abstract_factory;
public interface IProductFactory {
IphoneProduct iphoneProduct();
IRoundProduct iRoundProduct();
}
package abstract_factory;
public class XiaomiFactory implements IProductFactory {
@Override
public IphoneProduct iphoneProduct() {
// TODO Auto-generated method stub
return new XiaomiPhone();
}
@Override
public IRoundProduct iRoundProduct() {
// TODO Auto-generated method stub
return new XiaomiRound();
}
}
package abstract_factory;
public class HuaweiFactory implements IProductFactory {
@Override
public IphoneProduct iphoneProduct() {
// TODO Auto-generated method stub
return new HuaweiPhone();
}
@Override
public IRoundProduct iRoundProduct() {
// TODO Auto-generated method stub
return new HuaweiRound();
}
}
package abstract_factory;
public class Client {
public static void main(String[] args) {
XiaomiFactory xiaomiFactory=new XiaomiFactory();//工厂创建对象
IphoneProduct iphoneProduct=xiaomiFactory.iphoneProduct();//产品创建对象
iphoneProduct.message();//对象实现具体方法
HuaweiFactory huaweiFactory=new HuaweiFactory();
IRoundProduct iRoundProduct=huaweiFactory.iRoundProduct();
iRoundProduct.openWIFI();
}
}