工厂模式包含简单工厂模式、工厂模式、抽象工厂模式,这三种极其相似,但最终的目的都是为了解耦。
简单工厂模式,顾名思义一个工厂可以生产多很多产品,而这些产品的种类非常多,这个工厂可以生产出各种手机。因此,我们来想想工厂模式,首先它需要有一个工厂类Factory类,再者这么多手机种类需要一个抽象父类来定义手机的属性和方法,接着这个继承这个抽象类来定义各种手机,并在这个工厂类Factory生成,这个工厂是一个具体的类,不是接口也不是抽象类。
简单工厂模式
工厂类(产品抽象化,工厂实例化)
package designmode.factory;
public class Factory {
public static AbstractProduct getProduct(String type){
if(type.equals("A")){
return new AProduct();
}
if(type.equals("B")){
return new BProduct();
}
if(type.equals("C")){
return new CProduct();
}
return null;
}
}
抽象父类
package designmode.factory;
public abstract class AbstractProduct {
public abstract void createProduct();
}
继承子类
package designmode.factory;
public class AProduct extends AbstractProduct{
@Override
public void createProduct() {
System.out.println("生产a......");
}
}
package designmode.factory;
public class BProduct extends AbstractProduct{
@Override
public void createProduct() {
System.out.println("生产b......");
}
}
package designmode.factory;
public class CProduct extends AbstractProduct{
@Override
public void createProduct() {
System.out.println("生产c......");
}
}
测试类
要生成哪种手机,只需要告诉工厂就可以了
package designmode.factory;
public class FactoryTest {
public static void main(String[] args) {
AbstractProduct a = Factory.getProduct("A");
a.createProduct();
AbstractProduct b = Factory.getProduct("B");
b.createProduct();
AbstractProduct c = Factory.getProduct("C");
c.createProduct();
}
}
运行结果
生产a......
生产b......
生产c......
==================================================================
==================================================================
工厂模式
提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该类创建对应类的实例。
一定程度解耦,实现了消费者和产品类隔开,只依赖产品的接口,产品的实现与消费者无关。也增加了产品的扩展性,创建产品,只要实现产品接口就可以了。
工厂模式要素:
1、提供产品类的接口,创建产品的时候,实现产品接口就可以,当然多态,也可以继承abstract抽象类。
2、提供工厂类的接口,工厂均要实现这个接口,即抽象工厂。
3、由工厂类来创建实例产品,所以工厂类要有一个方法来创建产品。
【代码】
产品类接口
package designmode.abstractfactory;
public interface IProduct1 {
public void show();
}
package designmode.abstractfactory;
public interface IProduct2 {
public void show();
}
工厂类接口
package designmode.abstractfactory;
public interface IFactory {
public IProduct1 createProduct1();
public IProduct2 createProduct2();
}
工厂类
package designmode.abstractfactory;
public class Factory implements IFactory{
@Override
public IProduct1 createProduct1() {
return new Product1();
}
@Override
public IProduct2 createProduct2() {
return new Product2();
}
}
消费者
package designmode.abstractfactory;
public class AbstractFactoryTest {
public static void main(String[] args) {
Factory factory = new Factory();
factory.createProduct1().show();
factory.createProduct2().show();
}
}
运行结果:
这是1型产品
这是2型产品
抽象工厂模式
抽象工厂模式是工厂模式的升级版,他用来创建一组相关或者相互依赖的对象。工厂模式针对一个产品等级结构,在编程里,一个等级结构就相当于一个接口或者一个抽象类。而抽象工厂模式是针对一个产品等级结构组,可以从不同接口或抽象类衍生而来。
这三种的区别:
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
两者皆可。
开闭原则?