工厂模式
简介
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
优点
1、调用者如果想要创建一个对象,只需要知道它的类名称就行了,而无需知道它是如何创建出来的。
2、扩展性高,如果想增加一个产品的话,只要扩展一个工厂类就可以
3、屏蔽产品的具体实现,调用者只关心产品的接口就可以了
缺点
会提高系统的复杂性,每次增加一个产品的话,都需要增加一个具体类和对象实现工厂,使得整个系统的类的数目成倍的增加,也会增加系统对类的依赖性,这并不是什么好事
UML
实现
public interface PhoneProduct {
/**
* 生产手机
*/
public void phone();
}
public class HuaWeiProduct implements PhoneProduct {
@Override
public void phone() {
System.out.println("华为手机!");
}
}
public class XiaoMiProduct implements PhoneProduct {
@Override
public void phone() {
System.out.println("小米手机!");
}
}
public interface Factory {
public PhoneProduct concreteFactory(String className);
}
public class ConcreteFactory implements Factory {
@Override
public PhoneProduct concreteFactory(String className) {
if ("HuaWei".equalsIgnoreCase(className)){
return new HuaWeiProduct();
}else if ("xiaomi".equalsIgnoreCase(className)){
return new XiaoMiProduct();
}
return null;
}
}
public class Client {
public static void main(String[] args) {
Factory factory = new ConcreteFactory();
PhoneProduct huawei = factory.concreteFactory("huawei");
huawei.phone();
PhoneProduct xiaomi = factory.concreteFactory("xiaomi");
xiaomi.phone();
}
}
抽象工厂模式
简介
抽象工厂模式,它是工厂的工厂,意思就是,它用来创建某个工厂。工厂再创建具体产品
优点
在增加某个产品族下的某类产品的时候是非常方便的,不需要再新增加更多的工厂。
缺点
但是在增加一个新的产品族的话,是非常复杂的,会增加整个系统的复杂性
UML
实现
public interface PhoneProduct {
public void phone();
}
public class HuaWeiPhone implements PhoneProduct {
@Override
public void phone() {
System.out.println("华为手机");
}
}
public class XiaoMiPhone implements PhoneProduct {
@Override
public void phone() {
System.out.println("小米手机");
}
}
public interface ColorProduct {
public void fill();
}
public class RedProduct implements ColorProduct {
@Override
public void fill() {
System.out.println("红色");
}
}
public class BlueProduct implements ColorProduct {
@Override
public void fill() {
System.out.println("蓝色");
}
}
public abstract class AbstractFactory {
public abstract ColorProduct getColor(String className);
public abstract PhoneProduct getPhone(String className);
}
public class ColorFactory extends AbstractFactory {
@Override
public ColorProduct getColor(String className) {
if ("red".equalsIgnoreCase(className)){
return new RedProduct();
}else if ("blue".equalsIgnoreCase(className)){
return new BlueProduct();
}
return null;
}
@Override
public PhoneProduct getPhone(String className) {
return null;
}
}
public class PhoneFactory extends AbstractFactory{
@Override
public ColorProduct getColor(String className) {
return null;
}
@Override
public PhoneProduct getPhone(String className) {
if ("HuaWei".equalsIgnoreCase(className)){
return new HuaWeiPhone();
}else if ("xiaomi".equalsIgnoreCase(className)){
return new XiaoMiPhone();
}
return null;
}
}
public class FactoryProducer {
public static AbstractFactory getFactory(String factoryName){
if ("phone".equalsIgnoreCase(factoryName)){
return new PhoneFactory();
}else if ("color".equalsIgnoreCase(factoryName)){
return new ColorFactory();
}
return null;
}
}
public class Client {
public static void main(String[] args) {
AbstractFactory phoneFactory = FactoryProducer.getFactory("phone");
PhoneProduct xiaomi = phoneFactory.getPhone("xiaomi");
xiaomi.phone();
PhoneProduct huawei = phoneFactory.getPhone("huawei");
huawei.phone();
AbstractFactory colorFactory = FactoryProducer.getFactory("color");
ColorProduct red = colorFactory.getColor("red");
red.fill();
ColorProduct blue = colorFactory.getColor("blue");
blue.fill();
}
}