Java 工厂模式学习

时间:2023-12-25 23:57:25

工厂模式分三种:简单工厂、工厂方法、抽象工厂。其中抽象工厂是用于多个产品族的情况。所谓产品族就是不同产品组成的有机整体,各不同产品之间相互依赖。打个比方,一台电脑有CPU、主板、内存和硬盘等,这些不同产品组成了一个产品族。就好比Dell和HP要把这些产品进行不同的组装,这时就需要用到抽象工厂。以下是代码演示:

简单工厂,可以用反射实现:

首先定义产品的抽象接口

package com.demo.SimpleFactory;

public interface CPU {
public void run();
}

定义具体产品

package com.demo.SimpleFactory;

public class Intel implements CPU {

    @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("This is Intel!");
} }
package com.demo.SimpleFactory;

public class Amd implements CPU {

    @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("This is Amd!");
} }

定义工厂类

package com.demo.SimpleFactory;

public class Factory {
public static CPU create(String str) {
CPU c = null;
try {
c = (CPU) Class.forName("com.demo.SimpleFactory." + str)
.newInstance(); } catch (Exception e) {
e.printStackTrace();
}
return c;
}
}

测试如下

package com.demo.SimpleFactory;

public class Test {
public static void main(String[] args){
CPU c=Factory.create("Amd");
c.run();
}
}

打印结果:

This is Amd!

工厂方法

首先定义产品的抽象接口

package com.demo.SimpleFactory;

public interface CPU {
public void run();
}

定义具体产品

package com.demo.SimpleFactory;

public class Intel implements CPU {

    @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("This is Intel!");
} }
package com.demo.SimpleFactory;

public class Amd implements CPU {

    @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("This is Amd!");
} }

定义抽象工厂,具体现实由其子类负责

package com.demo.FactoryMethod;

public interface FactoryMethod {
public CPU create();
}

具体子类工厂

package com.demo.FactoryMethod;

public class AmdFactory implements FactoryMethod {

    @Override
public CPU create() {
// TODO Auto-generated method stub
return new Amd();
} }
package com.demo.FactoryMethod;

public class IntelFactory implements FactoryMethod {
public CPU create() {
return new Intel();
}
}

测试

package com.demo.FactoryMethod;

public class Test {

    public static void main(String[] args) {
FactoryMethod af=new IntelFactory();
CPU c=af.create();
c.run();
}
}

打印结果:

This is Intel!

抽象工厂

首先定义产品的抽象接口

package com.demo.SimpleFactory;

public interface CPU {
public void run();
}

定义具体产品

package com.demo.SimpleFactory;

public class Intel implements CPU {

    @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("This is Intel!");
} }
package com.demo.SimpleFactory;

public class Amd implements CPU {

    @Override
public void run() {
// TODO Auto-generated method stub
System.out.println("This is Amd!");
} }
package com.demo.AbstractFactory;

public interface Memory {
public void read(String str);
}
package com.demo.AbstractFactory;

public class KingstonMemory implements Memory {

    public KingstonMemory() {
// TODO Auto-generated constructor stub
} @Override
public void read(String str) {
// TODO Auto-generated method stub
System.out.println("Kingston Read data is:"+str);
} }
package com.demo.AbstractFactory;

public class AdataMemory implements Memory {

    public AdataMemory() {
// TODO Auto-generated constructor stub
} @Override
public void read(String str) {
// TODO Auto-generated method stub
System.out.println("Adata read data is:"+str);
} }

定义抽象工厂

package com.demo.AbstractFactory;

public interface AbstractFactory {

    public CPU createCPU();

    public Memory createMemory();
}

不同子类产生不同产品族

package com.demo.AbstractFactory;

public class DellFactory implements AbstractFactory {

    @Override
public CPU createCPU() {
// TODO Auto-generated method stub
return new Intel();
} @Override
public Memory createMemory() {
// TODO Auto-generated method stub
return new KingstonMemory();
} }
package com.demo.AbstractFactory;

public class HPFactory implements AbstractFactory {

    @Override
public CPU createCPU() {
// TODO Auto-generated method stub
return new Amd();
} @Override
public Memory createMemory() {
// TODO Auto-generated method stub
return new AdataMemory();
} }

测试

package com.demo.AbstractFactory;

public class Test {
public static void main(String[] args){
AbstractFactory hp=new HPFactory();
CPU cpu=hp.createCPU();
Memory memory=hp.createMemory();
cpu.run();
memory.read("Pass");
}
}

打印结果:

This is Amd!
Adata read data is:Pass