推荐非常好的文章: https://www.jianshu.com/p/38493eb4ffbd
贴下自己的代码:
import org.junit.Test;
/**
* 三种工厂方式总结:
* 1. 对于固定产品和类是确定的,推荐简单工厂。
* 2. 对于一系列、大批量的对象生产,推荐使用抽象工厂。
*/
public class TestFactory {
/**
* 简单工厂
* 角色:
* 工厂类
* 产品抽象类(接口)
* 具体产品类
*
* 优点: 对象与使用者解耦
* 缺点: 违反开闭原则
*/
@Test
public void testSimpleFactory(){
FruitFactory fruitFactory = new FruitFactory();
// 获得apple对象
Apple apple = (Apple) fruitFactory.createFruit("apple");
// 获得苹果对象
Pear pear = (Pear) fruitFactory.createFruit("pear");
}
/**
* 工厂方法模式
* 角色:
* 工厂抽象类(接口)
* 具体工厂类
* 产品抽象类(接口)
* 具体产品类
*
* 优点: 解耦 遵从开闭原则
* 缺点: 代码多
*/
@Test
public void testFactoryMethod(){
AppleFactory appleFactory = new AppleFactory();
PearFactory pearFactory = new PearFactory();
// 获得apple对象
Apple apple = (Apple)appleFactory.createFruit();
// 获得苹果对象
Pear pear = (Pear)pearFactory.createFruit();
}
/**
* 抽象工厂
* 定义: 以组为单位
* 角色: 和工厂方法一样
* 抽象工厂和工厂方法的模式基本一样,区别在于,工厂方法是生产一个具体的产品,而抽象工厂可以用来生产一组相同,有相对关系的产品;
* 重点在于一组,一批,一系列;
* 例如:生产小米手机,小米手机有很多系列,小米note,红米note等;
* 假如小米note需要的配件有825的处理器,6英寸屏幕,而红米只需要650的处理器和5寸屏幕
* 这个案例使用抽象工厂比较合适。
*/
@Test
public void testAbstractFctory(){
PhoneFactory xiaomiFactory = new XiaoMiFactory();
PhoneFactory hongmiFactory = new HongMiFactory();
xiaomiFactory.getCpu().run();
hongmiFactory.getCpu().run();
}
}
/**
* 抽象接口
*/
public interface Fruit {
void whatIm();
}
/**
* 具体实现类 apple
*/
public class Apple implements Fruit {
@Override
public void whatIm() {
System.out.println("apple ...");
}
}
/**
* 具体实现类 pear
*/
public class Pear implements Fruit {
@Override
public void whatIm() {
System.out.println("pear ...");
}
}
/********************************简单工厂***********************************/
/**
* 简单工厂
* 优点: 解耦
* 缺点: 违反开闭原则(新增Fruit,需要修改代码)
* 应用场景: 产品的分类和名称相对固定,推荐使用简单工厂。
*/
public class FruitFactory {
public Fruit createFruit(String type) {
switch (type) {
case "apple":
return new Apple();
case "pear":
return new Pear();
}
return null;
}
}
/********************************工厂方法***********************************/
public interface FruitFactoryMethod {
// 生产水果
Fruit createFruit();
}
public class AppleFactory implements FruitFactoryMethod {
@Override
public Fruit createFruit() {
return new Apple();
}
}
public class PearFactory implements FruitFactoryMethod {
@Override
public Fruit createFruit() {
return new Pear();
}
}
/********************************抽象工厂***********************************/
/**
* cpu 接口 和 实现类
*/
public interface Cpu {
void run();
class Cpu650 implements Cpu {
@Override
public void run() {
System.out.println("cpu 650");
}
}
class Cpu825 implements Cpu {
@Override
public void run() {
System.out.println("cpu 825");
}
}
}
public interface Screen {
void size();
class Screen5 implements Screen {
@Override
public void size() {
System.out.println("screen size 5");
}
}
class Screen6 implements Screen {
@Override
public void size() {
System.out.println("screen size 6");
}
}
}
public interface PhoneFactory {
/**
* 获取cpu型号
* @return
*/
Cpu getCpu();
/**
* 获取屏幕尺寸
* @return
*/
Screen getScreen();
}
public class XiaoMiFactory implements PhoneFactory {
@Override
public Cpu getCpu() {
// 高性能处理器
return new Cpu.Cpu825();
}
@Override
public Screen getScreen() {
// 6寸大屏
return new Screen.Screen6();
}
}
public class HongMiFactory implements PhoneFactory {
@Override
public Cpu getCpu() {
// 高效处理器
return new Cpu.Cpu650();
}
@Override
public Screen getScreen() {
// 小屏手机
return new Screen.Screen5();
}
}
网友评论